Polimorfisme dalam Go: Pandangan Lebih Dekat pada Kaedah Antara Muka dan Penerima Penunjuk
Dalam Go, polimorfisme tidak disokong secara asli, tetapi ia boleh dicapai menggunakan antara muka. Ini memperkenalkan soalan biasa: mengapa kaedah penetap tidak dibenarkan untuk antara muka?
Seperti yang ditunjukkan dalam kod yang disediakan, apabila kaedah penetap ditakrifkan sebagai penerima nilai, perubahan yang dibuat dalam fungsi hilang apabila ia keluar . Mengubah suai penerima kepada penerima penuding membenarkan perubahan kekal, tetapi ia menimbulkan ralat kompilasi.
Untuk menangani perkara ini, Go menyediakan penyelesaian. Kod yang diperbetulkan mengubah suai penerima kaedah penetap menjadi penunjuk. Ini membolehkan fungsi mengubah suai struktur data asas dan mengekalkan perubahan. Kod yang diubah suai menggunakan antara muka, memastikan kaedah penerima penunjuk boleh diakses melalui antara muka.
package main import "fmt" 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 ini bukan polimorfisme sepenuhnya, ia berkesan mencapai hasil yang serupa dengan menggunakan antara muka dan penerima penunjuk. Kod ini boleh digunakan untuk menetapkan sifat melalui antara muka, merangkum data dan operasi dengan bersih.
Atas ialah kandungan terperinci Mengapa Antara Muka Pergi Tidak Boleh Menyokong Kaedah Penetap Secara Terus, dan Bagaimana Ini Boleh Diatasi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!