มีวิธีระบุค่าเริ่มต้นในฟังก์ชันของ Go หรือไม่? ฉันพยายามค้นหาสิ่งนี้ในเอกสาร แต่ไม่พบสิ่งที่ระบุว่าเป็นไปได้เลย
func SaySomething(i string = "Hello")(string){
...
}
มีวิธีระบุค่าเริ่มต้นในฟังก์ชันของ Go หรือไม่? ฉันพยายามค้นหาสิ่งนี้ในเอกสาร แต่ไม่พบสิ่งที่ระบุว่าเป็นไปได้เลย
func SaySomething(i string = "Hello")(string){
...
}
คำตอบ:
ไม่อำนาจของ Google เลือกที่จะไม่สนับสนุนสิ่งนั้น
https://groups.google.com/forum/#!topic/golang-nuts/-5MCaivW0qQ
ไม่ แต่มีตัวเลือกอื่น ๆ ในการใช้ค่าเริ่มต้น มีบทความดีๆในบล็อกเกี่ยวกับเรื่องนี้ แต่นี่คือตัวอย่างเฉพาะบางส่วน
// 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)
}
// 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)
}
// 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)
}
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)
}
func Concat1(a string = 'foo', b int = 10) string {
เช่นเดียวกับในภาษาสมัยใหม่อื่น ๆ ... มันจะลดตัวอย่างใด ๆ ที่ให้มาเป็นโค้ดหนึ่งบรรทัด
ไม่ไม่มีวิธีระบุค่าเริ่มต้น ฉันเชื่อว่าสิ่งนี้ทำโดยมีจุดประสงค์เพื่อเพิ่มความสามารถในการอ่านโดยเสียเวลาอีกเล็กน้อย (และหวังว่าจะคิด) ในตอนท้ายของนักเขียน
ฉันคิดว่าแนวทางที่เหมาะสมในการมี "ค่าเริ่มต้น" คือการมีฟังก์ชันใหม่ที่ให้ค่าเริ่มต้นเป็นฟังก์ชันทั่วไปมากกว่า ด้วยสิ่งนี้รหัสของคุณจะชัดเจนขึ้นตามเจตนาของคุณ ตัวอย่างเช่น:
func SaySomething(say string) {
// All the complicated bits involved in saying something
}
func SayHello() {
SaySomething("Hello")
}
ด้วยความพยายามเพียงเล็กน้อยฉันจึงสร้างฟังก์ชันที่ใช้งานได้ทั่วไปและนำฟังก์ชันทั่วไปกลับมาใช้ใหม่ คุณสามารถเห็นสิ่งนี้ได้ในหลาย ๆ ไลบรารีfmt.Println
เช่นเพียงแค่เพิ่มบรรทัดใหม่ในสิ่งที่fmt.Print
จะทำ อย่างไรก็ตามเมื่ออ่านรหัสของใครบางคนจะเห็นได้ชัดว่าพวกเขาตั้งใจจะทำอะไรโดยใช้ฟังก์ชันที่พวกเขาเรียกใช้ ด้วยค่าเริ่มต้นฉันจะไม่รู้ว่าควรจะเกิดอะไรขึ้นโดยไม่ต้องไปที่ฟังก์ชันเพื่ออ้างอิงว่าค่าเริ่มต้นคืออะไร