Polimorfisme dalam Go: Pelaksanaan Antara Muka
Walaupun Go tidak menyokong polimorfisme tradisional, antara muka menyediakan cara untuk mencapai kesan yang serupa. Walau bagaimanapun, batasan wujud apabila melaksanakan kaedah penetap.
Masalahnya
Pertimbangkan kod berikut:
type MyInterfacer interface { Get() int Set(i int) } type MyStruct struct { data int } func (this MyStruct) Get() int { return this.data }
Percubaan untuk melaksanakan keputusan kaedah Set dalam sebuah ralat:
func (this MyStruct) Set(i int) { this.data = i }
Penyelesaian
Untuk memintas pengehadan ini, penerima dalam kaedah Set mestilah penunjuk, seperti dalam:
func (this *MyStruct) Set(i int) { this.data = i }
Ini membolehkan kaedah mengubah suai data asas, yang ditunjukkan dalam antara muka pembolehubah.
Kod Dibetulkan
Kod diperbetulkan berikut berfungsi seperti yang dimaksudkan:
type MyInterfacer interface { Get() int Set(i int) } type MyStruct struct { data int } func (this *MyStruct) Get() int { return this.data } func (this *MyStruct) Set(i int) { this.data = i } func main() { s := &MyStruct{123} fmt.Println(s.Get()) s.Set(456) fmt.Println(s.Get()) var mi MyInterfacer = s mi.Set(789) fmt.Println(mi.Get()) }
Walaupun bukan polimorfisme sebenar, teknik ini membenarkan yang serupa tahap fleksibiliti melalui pelaksanaan antara muka dalam Go.
Atas ialah kandungan terperinci Mengapakah Kaedah Penetap Antara Muka Go Memerlukan Penunjuk?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!