Kaedah Memanggil untuk Jenis Penunjuk *T dengan Penerima T
Spesifikasi bahasa pengaturcaraan Go menyatakan bahawa set kaedah bagi sebarang jenis T terdiri daripada semua kaedah dengan jenis penerima T. Walau bagaimanapun, set kaedah jenis penunjuk yang sepadan T ialah set semua kaedah dengan penerima T atau T (termasuk set kaedah T).
Ini bermakna kita boleh memanggil kaedah dengan penerima jenis *T pada pembolehubah jenis T, kerana pengkompil secara tersirat menolak rujukan pembolehubah kepada panggil kaedah.
Untuk mengesahkan konsep ini, pertimbangkan kod berikut:
package main import ( "fmt" "reflect" ) type User struct{} func (self *User) SayWat() { fmt.Println(self) fmt.Println(reflect.TypeOf(self)) fmt.Println("WAT\n") } func main() { var user User = User{} fmt.Println(reflect.TypeOf(user), "\n") user.SayWat() }
Apabila kami menjalankan kod ini, kami perhatikan bahawa kaedah SayWat() boleh dipanggil pada pembolehubah pengguna, walaupun kaedah itu ditakrifkan dengan penerima penunjuk. Ini kerana pengkompil secara automatik menolak pembolehubah untuk kita.
Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa kita tidak boleh memanggil kaedah *T pada T secara langsung. Sebagai contoh, kod berikut akan gagal dengan ralat pengkompil:
func main() { var user User = User{} (&user).SayWat() }
Dalam kes ini, pengkompil tidak boleh menyahrujuk pembolehubah secara tersirat kerana kaedah SayWat() ditakrifkan dengan penerima penuding. Untuk memanggil kaedah, kita mesti secara eksplisit menolak pembolehubah dengan operator &.
Oleh itu, walaupun kita boleh memanggil kaedah dengan penerima jenis T pada pembolehubah jenis T, kita tidak boleh memanggil kaedah T pada T secara langsung.
Atas ialah kandungan terperinci Bolehkah Kaedah Penerima Penunjuk Go Dipanggil pada Pembolehubah Bukan Penunjuk?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!