Memahami Jenis Penerima untuk Pelaksanaan Antara Muka Go
Dalam Go, kaedah boleh mempunyai sama ada penerima nilai (func (t T) m()) atau penerima penunjuk (func (t *T) m()) untuk jenis struct. Jenis penerima menentukan nilai yang harus digunakan semasa memanggil kaedah.
Pertimbangkan kod berikut:
import "fmt" type greeter interface { hello() goodbye() } type tourGuide struct { name string } func (t tourGuide) hello() { fmt.Println("Hello", t.name) } func (t *tourGuide) goodbye() { fmt.Println("Goodbye", t.name) } func main() { var t1 tourGuide = tourGuide{"James"} t1.hello() // Hello James t1.goodbye() // Goodbye James (same as (&t1).goodbye()) var t2 *tourGuide = &tourGuide{"Smith"} t2.hello() // Hello Smith t2.goodbye() // Goodbye Smith (same as (*t2).hello()) // illegal: t1 is not assignable to g1 (why?) // var g1 greeter = t1 var g2 greeter = t2 g2.hello() // Hello Smith g2.goodbye() // Goodbye Smith }
Anda mungkin tertanya-tanya mengapa anda boleh memanggil kaedah TourGuide menggunakan sama ada t1 pembolehubah daripada jenis tourGuide atau penunjuk t2 jenis *tourGuide, tetapi anda tidak boleh menetapkan t1 kepada pembolehubah antara muka g1 jenis penyambut.
Sebabnya terletak pada jenis penerima kaedah antara muka. Dalam kes ini, hello dan goodbye mempunyai penerima penunjuk. Oleh itu, hanya nilai penunjuk boleh digunakan sebagai nilai penerima.
Apabila anda memanggil t1.hello() dan t1.goodbye(), pengkompil secara automatik mengambil alamat t1 dan menggunakannya sebagai penerima , kerana t1 ialah nilai yang boleh dialamatkan.
Walau bagaimanapun, apabila anda cuba menetapkan t1 kepada g1, pengkompil melihat bahawa t1 bukan penunjuk nilai, tetapi nilai jenis tourGuide. Antara muka tidak boleh dialamatkan, jadi pengkompil tidak boleh mengambil alamat t1 dan menetapkannya kepada g1.
Ringkasnya, penerima penunjuk memerlukan nilai penunjuk untuk memanggil kaedah, manakala penerima nilai boleh dipanggil dengan sama ada nilai atau penunjuk. Apabila melaksanakan antara muka dengan kaedah penerima penuding, hanya nilai penuding boleh diberikan kepada antara muka.
Atas ialah kandungan terperinci Mengapakah Saya Tidak Boleh Menetapkan Penerima Nilai kepada Antara Muka dengan Kaedah Penerima Penunjuk dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!