ค่าเริ่มต้นในวิธีการของ Go


99

มีวิธีระบุค่าเริ่มต้นในฟังก์ชันของ Go หรือไม่? ฉันพยายามค้นหาสิ่งนี้ในเอกสาร แต่ไม่พบสิ่งที่ระบุว่าเป็นไปได้เลย

func SaySomething(i string = "Hello")(string){
...
}

คำตอบ:



117

ไม่ แต่มีตัวเลือกอื่น ๆ ในการใช้ค่าเริ่มต้น มีบทความดีๆในบล็อกเกี่ยวกับเรื่องนี้ แต่นี่คือตัวอย่างเฉพาะบางส่วน


** ตัวเลือกที่ 1: ** ผู้โทรเลือกใช้ค่าเริ่มต้น
// Both parameters are optional, use empty string for default value
func Concat1(a string, b int) string {
  if a == "" {
    a = "default-a"
  }
  if b == 0 {
    b = 5
  }

  return fmt.Sprintf("%s%d", a, b)
}

** ตัวเลือกที่ 2: ** พารามิเตอร์ทางเลือกเดียวในตอนท้าย
// a is required, b is optional.
// Only the first value in b_optional will be used.
func Concat2(a string, b_optional ...int) string {
  b := 5
  if len(b_optional) > 0 {
    b = b_optional[0]
  }

  return fmt.Sprintf("%s%d", a, b)
}

** ตัวเลือกที่ 3: ** โครงสร้างการกำหนดค่า
// A declarative default value syntax
// Empty values will be replaced with defaults
type Parameters struct {
  A string `default:"default-a"` // this only works with strings
  B string // default is 5
}

func Concat3(prm Parameters) string {
  typ := reflect.TypeOf(prm)

  if prm.A == "" {
    f, _ := typ.FieldByName("A")
    prm.A = f.Tag.Get("default")
  }

  if prm.B == 0 {
    prm.B = 5
  }

  return fmt.Sprintf("%s%d", prm.A, prm.B)
}

** ตัวเลือกที่ 4: ** การแยกวิเคราะห์อาร์กิวเมนต์แบบเต็ม (รูปแบบจาวาสคริปต์)
func Concat4(args ...interface{}) string {
  a := "default-a"
  b := 5

  for _, arg := range args {
    switch t := arg.(type) {
      case string:
        a = t
      case int:
        b = t
      default:
        panic("Unknown argument")
    }
  }

  return fmt.Sprintf("%s%d", a, b)
}

90
ช่างเป็นความเจ็บปวด ฉันหวังว่ามันจะเป็นfunc Concat1(a string = 'foo', b int = 10) string {เช่นเดียวกับในภาษาสมัยใหม่อื่น ๆ ... มันจะลดตัวอย่างใด ๆ ที่ให้มาเป็นโค้ดหนึ่งบรรทัด
Rotareti

เรามีตัวเลือกในการเขียนสองฟังก์ชันที่แตกต่างกันหรือไม่และปล่อยให้ผู้โทรแจ้งอย่างชัดเจนเกี่ยวกับสิ่งที่พวกเขาคาดหวัง
ProgramCpp

@ProgramCpp ไม่ golang ไม่อนุญาตให้มีการทำงานมากเกินไปภาษา Go มีฟังก์ชัน / วิธีการทำงานมากเกินไปหรือไม่
Vusal

9

ไม่ไม่มีวิธีระบุค่าเริ่มต้น ฉันเชื่อว่าสิ่งนี้ทำโดยมีจุดประสงค์เพื่อเพิ่มความสามารถในการอ่านโดยเสียเวลาอีกเล็กน้อย (และหวังว่าจะคิด) ในตอนท้ายของนักเขียน

ฉันคิดว่าแนวทางที่เหมาะสมในการมี "ค่าเริ่มต้น" คือการมีฟังก์ชันใหม่ที่ให้ค่าเริ่มต้นเป็นฟังก์ชันทั่วไปมากกว่า ด้วยสิ่งนี้รหัสของคุณจะชัดเจนขึ้นตามเจตนาของคุณ ตัวอย่างเช่น:

func SaySomething(say string) {
    // All the complicated bits involved in saying something
}

func SayHello() {
    SaySomething("Hello")
}

ด้วยความพยายามเพียงเล็กน้อยฉันจึงสร้างฟังก์ชันที่ใช้งานได้ทั่วไปและนำฟังก์ชันทั่วไปกลับมาใช้ใหม่ คุณสามารถเห็นสิ่งนี้ได้ในหลาย ๆ ไลบรารีfmt.Printlnเช่นเพียงแค่เพิ่มบรรทัดใหม่ในสิ่งที่fmt.Printจะทำ อย่างไรก็ตามเมื่ออ่านรหัสของใครบางคนจะเห็นได้ชัดว่าพวกเขาตั้งใจจะทำอะไรโดยใช้ฟังก์ชันที่พวกเขาเรียกใช้ ด้วยค่าเริ่มต้นฉันจะไม่รู้ว่าควรจะเกิดอะไรขึ้นโดยไม่ต้องไปที่ฟังก์ชันเพื่ออ้างอิงว่าค่าเริ่มต้นคืออะไร


ฉันชอบและเห็นด้วยกับคำตอบนี้ แต่ฉันก็ยังหวังว่าอย่างน้อยพวกเขาก็มีวิธีที่ป้าน แต่เป็นสำนวนในการทำ
Sam

12
"เพียงแค่เพิ่มฟังก์ชั่นอื่น"อาร์กิวเมนต์สามารถทำให้เกิดการระเบิดของวิธีการที่จำเป็นในการจัดการกับพีชคณิตหลายต้องภาระในการตัดสินใจเกี่ยวกับความหมายค้นพบและ Rememberable ชื่อสำหรับวิธีการเหล่านั้นและเพิ่มภาระให้กับการเรียนรู้แพคเกจที่ใช้วิธีการอื่น ๆ อีกมากมาย VS . น้อย. #jmtcw
MikeSchinkel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.