Go'nun işlevinde varsayılan değeri belirlemenin bir yolu var mı? Bunu belgelerde bulmaya çalışıyorum ancak bunun mümkün olduğunu belirten hiçbir şey bulamıyorum.
func SaySomething(i string = "Hello")(string){
...
}
Yanıtlar:
Hayır, Google'daki yetkiler bunu desteklemedi.
https://groups.google.com/forum/#!topic/golang-nuts/-5MCaivW0qQ
HAYIR, ancak varsayılan değeri uygulamak için başka seçenekler de vardır. Konuyla ilgili bazı güzel blog yazıları var, ancak işte bazı özel örnekler.
// 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 {
diğer modern dillerin çoğunda olduğu gibi ... Verilen örneklerden herhangi birini hemen hemen tek bir kod satırına indirgeyecekti.
Hayır, varsayılanları belirlemenin bir yolu yoktur. Bunun yazarın tarafında biraz daha fazla zamana (ve umarım düşünerek) okunabilirliği artırmak için yapıldığına inanıyorum.
Bir "varsayılana" sahip olmanın doğru yaklaşımının, varsayılanı daha genel işleve sağlayan yeni bir işleve sahip olmak olduğunu düşünüyorum. Buna sahip olduğunuzda, kodunuz amacınıza göre daha net hale gelir. Örneğin:
func SaySomething(say string) {
// All the complicated bits involved in saying something
}
func SayHello() {
SaySomething("Hello")
}
Çok az çabayla, ortak bir şey yapan ve genel işlevi yeniden kullanan bir işlev yaptım. Bunu birçok kütüphanede görebilirsiniz, fmt.Println
örneğin fmt.Print
, aksi halde ne yapacağına bir satırsonu ekler . Ancak birinin kodunu okurken, dedikleri işlevle ne yapmak istedikleri açıktır. Varsayılan değerlerle, varsayılan değerin gerçekte ne olduğunu referans almak için işleve de gitmeden ne olması gerektiğini bilemeyeceğim.