Apakah ada cara untuk menentukan nilai default dalam fungsi Go? Saya mencoba menemukan ini di dokumentasi tetapi saya tidak dapat menemukan apa pun yang menentukan bahwa ini bahkan mungkin.
func SaySomething(i string = "Hello")(string){
...
}
Jawaban:
Tidak, kekuatan yang ada di Google memilih untuk tidak mendukungnya.
https://groups.google.com/forum/#!topic/golang-nuts/-5MCaivW0qQ
TIDAK, tetapi ada beberapa opsi lain untuk menerapkan nilai default. Ada beberapa posting blog yang bagus tentang subjek ini, tetapi berikut ini beberapa contoh spesifik.
// 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 {seperti di kebanyakan bahasa modern lainnya ... Ini akan mengurangi sebagian besar contoh yang diberikan menjadi satu baris kode.
Tidak, tidak ada cara untuk menentukan default. Saya percaya ini dilakukan dengan tujuan untuk meningkatkan keterbacaan, dengan mengorbankan lebih banyak waktu (dan, semoga, pemikiran) di pihak penulis.
Saya pikir pendekatan yang tepat untuk memiliki "default" adalah memiliki fungsi baru yang memasok default itu ke fungsi yang lebih umum. Setelah ini, kode Anda menjadi lebih jelas tentang maksud Anda. Sebagai contoh:
func SaySomething(say string) {
// All the complicated bits involved in saying something
}
func SayHello() {
SaySomething("Hello")
}
Dengan sedikit usaha, saya membuat fungsi yang melakukan hal umum dan menggunakan kembali fungsi generik. Anda dapat melihat ini di banyak pustaka, fmt.Printlnmisalnya hanya menambahkan baris baru ke apa yang fmt.Printseharusnya dilakukan. Namun, saat membaca kode seseorang, jelas apa yang ingin mereka lakukan dengan fungsi yang mereka panggil. Dengan nilai default, saya tidak akan tahu apa yang seharusnya terjadi tanpa juga pergi ke fungsi untuk mereferensikan apa nilai default sebenarnya.