Rumah >pembangunan bahagian belakang >Golang >Mengapa Panggilan Kaedah Rantaian Gagal dengan Penerima Penunjuk dalam Go?
Memahami ""tidak boleh mengambil alamat"" dan ""tidak boleh memanggil kaedah penunjuk dihidupkan"" dalam Go
Walaupun mempunyai fungsi yang serupa daripada coretan kod, satu menyusun dan berfungsi manakala satu lagi menjana ralat:
// This compiles and works diff := projected.Minus(c.Origin) dir := diff.Normalize() // This does not (yields the errors in the title) dir := projected.Minus(c.Origin).Normalize()
The ketaksamaan dikaitkan dengan perbezaan dalam jenis penerima untuk kaedah Normalize().
Jenis Penerima dalam Kaedah Go
Kaedah Go boleh mempunyai sama ada penerima nilai atau penunjuk penerima. Penerima nilai beroperasi pada salinan struct manakala penerima penuding beroperasi pada struct asal itu sendiri.
Dalam kes Normalize(), ia mempunyai penerima penuding, memerlukan penuding kepada nilai Vector3 sebagai penerima.
Mengalamatkan Pembolehubah dan Pulangan Nilai
Pembolehubah dalam Go boleh dialamatkan, bermakna alamat pembolehubah boleh diambil sebagai hujah kepada kaedah penerima penunjuk. Walau bagaimanapun, nilai pulangan bagi fungsi dan panggilan kaedah tidak boleh dialamatkan.
Panggilan Berantai dengan Penerima Penunjuk
Dalam contoh di mana ia menyusun, pengkompil secara automatik mengambil alamat daripada pembolehubah perbezaan untuk memadankan penerima penunjuk Normalize().
Dalam contoh di mana ia tidak menyusun, pengkompil tidak boleh secara automatik mengambil alamat nilai pulangan Minus() kerana ia tidak boleh dialamatkan. Nilai pulangan ialah salinan, ia mesti diberikan kepada pembolehubah terlebih dahulu, supaya alamatnya boleh diambil.
Penyelesaian
Beberapa penyelesaian wujud untuk menyelesaikan isu tersebut :
Ketekalan dalam Penerima dan Jenis Hasil
Adalah dinasihatkan untuk mengekalkan ketekalan dalam jenis penerima dan hasil sepanjang jenis tersuai. Jika kebanyakan kaedah mempunyai penerima penunjuk, semua kaedah harus menggunakan penerima penunjuk. Begitu juga, jika kebanyakan kaedah mengembalikan penunjuk, semua kaedah harus mengembalikan penunjuk.
Atas ialah kandungan terperinci Mengapa Panggilan Kaedah Rantaian Gagal dengan Penerima Penunjuk dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!