Bolehkah Kaedah Jenis Penunjuk Dipanggil pada Jenis Mudah dalam Go?
Walaupun spesifikasi Go menyatakan bahawa kaedah ditetapkan untuk T termasuk kaedah T, timbul kekeliruan tentang sama ada kaedah dengan penerima T boleh digunakan pada pembolehubah jenis T.
Penggunaan Kaedah
Inti masalah ialah panggilan kaedah tidak terhad kepada menggunakan jenis penerima penuding. Pengkompil bijak mengendalikan invokasi kaedah dengan secara automatik membatalkan rujukan nilai untuk mendapatkan jenis penerima yang dikehendaki. Sebenarnya, panggilan ke kaedah dengan *T penerima adalah bersamaan dengan panggilan pada (&pengguna).m(), di mana &pengguna mendapatkan semula alamat pembolehubah.
Demonstrasi Praktikal
Pertimbangkan contoh kod berikut:
package main import "fmt" 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.SayWat() }
Setelah menjalankan kod ini, anda akan perasan bahawa kaedah dilaksanakan dengan jayanya, walaupun pengguna bukan jenis penunjuk. Ini kerana pengkompil secara automatik menolak rujukan pengguna untuk memanggil kaedah SayWat.
Mengatasi Kekaburan
Perbezaan yang pasti muncul apabila berurusan dengan kaedah kembali. Jika kaedah mengembalikan nilai, ia menghasilkan hasil yang tidak boleh ditangani, yang tidak boleh digunakan secara langsung dengan sintaks titik. Sebaliknya, gunakan sintaks "&" secara eksplisit untuk mendapatkan alamat nilai pulangan.
Atas ialah kandungan terperinci Bolehkah Kaedah Go dengan Penerima Penunjuk Dipanggil pada Pembolehubah Bukan Penunjuk?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!