Set Kaedah Go: Kaedah Sebut untuk Jenis Penunjuk dan Penerima
Satu aspek set kaedah Go yang sering dibincangkan timbul apabila cuba membuat panggilan kaedah dengan jenis penerima T pada pembolehubah jenis T. Spesifikasi Go menyatakan bahawa set kaedah T termasuk kedua-dua kaedah dengan jenis penerima *T dan kaedah dengan jenis penerima T.
Inferens Bercanggah
Walau bagaimanapun, contoh berikut menunjukkan bahawa inferens ini boleh kelihatan berlawanan dengan intuisi:
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() }
Penyusun Inferens
Pengkompil membuat kesimpulan bahawa pengguna.SayWat() memanggil kaedah dengan jenis penerima *T, walaupun pengguna boleh ubah mempunyai jenis T. Tingkah laku ini disebabkan oleh pemasukan automatik pengkompil bagi &, alamat-pengendali. Pada dasarnya, ia menulis semula panggilan kepada (&pengguna).SayWat().
Kaedah Memanggil untuk Jenis Penunjuk
Adalah penting untuk menjelaskan bahawa sementara nampaknya kaedah untuk jenis penunjuk dipanggil pada pembolehubah jenis T, ini tidak benar. Pengkompil menggunakan penerima jenis *T dan penyahrujukan &pengguna kepada T ialah operasi tersirat.
Pengecualian kepada Penyahrujukan Tersirat
Walau bagaimanapun, tersirat ini penyahrujukan tidak terpakai dalam semua kes. Memanggil kaedah dengan penerima penuding pada nilai pulangan (tidak boleh dialamatkan) akan mengakibatkan ralat masa kompilasi, seperti:
func aUser() User { return User{} } ... aUser().SayWat()
Mesej Ralat
cannot call pointer method on aUser() cannot take the address of aUser()
Atas ialah kandungan terperinci Mengapakah Penyahrujukan Secara Tersirat Apabila Memanggil Kaedah Penerima Penunjuk?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!