Czy istnieje sposób na określenie wartości domyślnej w funkcji Go? Próbuję znaleźć to w dokumentacji, ale nie mogę znaleźć niczego, co by wskazywało, że jest to w ogóle możliwe.
func SaySomething(i string = "Hello")(string){
...
}
Odpowiedzi:
Nie, władze Google zdecydowały się tego nie wspierać.
https://groups.google.com/forum/#!topic/golang-nuts/-5MCaivW0qQ
NIE, ale są inne opcje implementacji wartości domyślnej. Jest kilka dobrych postów na ten temat, ale oto kilka konkretnych przykładów.
// 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 {
jak w większości innych współczesnych języków ... To zredukowałoby dowolny z podanych przykładów do jednej linii kodu.
Nie, nie ma możliwości określenia wartości domyślnych. Wierzę, że robi się to celowo, aby zwiększyć czytelność, kosztem trochę więcej czasu (i miejmy nadzieję, przemyślenia) po stronie autora.
Myślę, że właściwym podejściem do posiadania „wartości domyślnej” jest posiadanie nowej funkcji, która zapewnia tę domyślną funkcję bardziej ogólną. Mając to, twój kod staje się jaśniejszy w twoim zamiarze. Na przykład:
func SaySomething(say string) {
// All the complicated bits involved in saying something
}
func SayHello() {
SaySomething("Hello")
}
Z niewielkim wysiłkiem stworzyłem funkcję, która robi zwykłą rzecz i ponownie użyłem funkcji ogólnej. Możesz to zobaczyć w wielu bibliotekach, fmt.Println
na przykład po prostu dodaje nowy wiersz do tego fmt.Print
, co by zrobił w przeciwnym razie. Jednak czytając czyjś kod, jest jasne, co zamierza zrobić za pomocą funkcji, którą wywołuje. Przy wartościach domyślnych nie będę wiedział, co ma się stać, bez przejścia do funkcji, aby odnieść się do wartości domyślnej.