Apakah ada cara untuk menentukan nilai default di Go's fungsi? Saya mencoba untuk menemukan hal ini di dokumentasi tapi aku bisa't menemukan apa-apa yang menentukan bahwa ini adalah mungkin.
func SaySomething(i string = "Hello")(string){
...
}
TIDAK,tapi ada beberapa pilihan lain untuk melaksanakan nilai default. Ada beberapa baik posting blog pada subjek, tapi di sini ada beberapa contoh-contoh spesifik.
Opsi 1: pemanggil memilih untuk menggunakan nilai default
// 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)
}
Pilihan 2: satu parameter opsional pada akhir
// 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)
}
Opsi 3: konfigurasi struct
// 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)
}
Pilihan 4: Penuh variadic argumen parsing (javascript style)
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)
}
Tidak, tidak ada cara untuk menentukan default. Saya percaya hal ini dilakukan dengan tujuan untuk meningkatkan keterbacaan, pada biaya sedikit lebih banyak waktu (dan, mudah-mudahan, pikiran) pada penulis's end.
Saya pikir pendekatan yang tepat untuk memiliki "default" adalah untuk memiliki fungsi baru yang persediaan yang default ke yang lebih umum fungsi. Setelah ini, kode anda menjadi lebih jelas pada niat anda. Misalnya:
func SaySomething(say string) {
// All the complicated bits involved in saying something
}
func SayHello() {
SaySomething("Hello")
}
Dengan sedikit usaha, saya dibuat fungsi yang melakukan hal yang umum dan digunakan kembali fungsi generik. Anda dapat melihat ini di berbagai perpustakaan, fmt.Println
misalnya hanya menambahkan baris baru pada apa yang fmt.Cetak
jika tidak akan dilakukan. Ketika membaca seseorang's kode, namun, jelas apa yang mereka berniat untuk melakukan dengan fungsi yang mereka sebut. Dengan nilai-nilai default, I won't tahu apa yang seharusnya terjadi tanpa juga akan fungsi untuk referensi apa default nilai sebenarnya.