Kaedah Go pada Jenis Penunjuk: Kaedah Memanggil dengan Penerima T untuk Jenis Penunjuk *T
Soalan:
Spesifikasi Go menyatakan bahawa set kaedah jenis penunjuk T termasuk set kaedah jenis T yang sepadan. Adakah ini bermakna kita boleh memanggil kaedah dengan penerima T pada pembolehubah jenis T?
Jawapan:
Walaupun spesifikasi mencadangkan ini, adalah penting untuk ambil perhatian bahawa anda tidak boleh secara langsung memanggil kaedah *T pada T. Sebaliknya, pengkompil secara automatik menolak rujukan berubah kepada &T dan menggunakan kaedah, melaksanakan (&T).m() dengan berkesan.
Tingkah laku ini ditakrifkan secara eksplisit dalam spesifikasi Go:
"Panggilan: Panggilan kaedah x.m() ialah sah jika set kaedah (jenis) x mengandungi m dan senarai argumen boleh diberikan kepada senarai parameter m Jika x boleh dialamatkan dan set kaedah &x mengandungi m, x.m() ialah singkatan untuk (&x).m. (). "
Demonstrasi:
Contoh berikut menggambarkan tingkah laku ini:
package main import ( "fmt" "reflect" ) type User struct{} func (this *User) SayWat() { fmt.Println(reflect.TypeOf(this)) fmt.Println("WAT\n") } func main() { var user = User{} fmt.Println(reflect.TypeOf(user)) user.SayWat() }
Walaupun mengisytiharkan kaedah SayWat dengan penerima * Pengguna, kami boleh memanggilnya pada pengguna, iaitu jenis Pengguna. Pengkompil mengendalikan penyahrujukan dan panggilan (&pengguna) secara automatik. Jika anda cuba memanggil kaedah penunjuk pada nilai yang tidak boleh dialamatkan, anda akan menghadapi ralat. Contohnya:
Atas ialah kandungan terperinci Bolehkah Kaedah Go dengan Jenis Penerima `T` Dipanggil pada Pembolehubah Jenis `*T`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!