Pembebanan Kaedah dalam Go: Sekatan pada Jenis Argumen
Dalam Go, kaedah dengan nama dan arity yang sama (bilangan argumen) boleh beroperasi pada jenis yang berbeza. Walau bagaimanapun, jika anda cuba mengalihkan penerima kaedah sedemikian ke argumen, anda akan menghadapi ralat kompilasi.
Pertimbangkan kod berikut:
type A struct { Name string } type B struct { Name string } func (a *A) Print() { fmt.Println(a.Name) } func (b *B) Print() { fmt.Println(b.Name) } func main() { a := &A{"A"} b := &B{"B"} a.Print() b.Print() }
Kod ini berjaya mencetak "A" dan "B" ke konsol. Walau bagaimanapun, jika anda mengubah suai tandatangan kaedah seperti berikut:
func Print(a *A) { fmt.Println(a.Name) } func Print(b *B) { fmt.Println(b.Name) } func main() { a := &A{"A"} b := &B{"B"} Print(a) Print(b) }
Anda akan menghadapi ralat kompilasi:
./test.go:22: Print redeclared in this block previous declaration at ./test.go:18 ./test.go:40: cannot use a (type *A) as type *B in function argument
Sebab Sekatan
Go tidak menyokong lebihan muatan fungsi yang ditentukan pengguna berdasarkan jenis hujahnya. Ini berbeza dengan beberapa bahasa lain, seperti C , yang membenarkan lebihan muatan berdasarkan kedua-dua nama fungsi dan jenis argumen.
Dalam Go, fungsi dengan nama dan arity yang sama mesti mempunyai tandatangan yang sama. Jika anda ingin "membebankan" fungsi pada satu parameter, anda mesti menggunakan kaedah. Contohnya, anda boleh mencipta kaedah Cetak untuk setiap struct anda:
func (a A) Print() { fmt.Println(a.Name) } func (b B) Print() { fmt.Println(b.Name) }
Pendekatan ini membolehkan anda menggunakan nama kaedah yang sama sambil mengekalkan keselamatan jenis kod anda.
Atas ialah kandungan terperinci Mengapa Tidak Menyokong Lebihan Pemuatan Berdasarkan Jenis Hujah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!