Rumah > pembangunan bahagian belakang > Golang > Mengapa Panggilan Kaedah Rantaian Gagal dengan Penerima Penunjuk dalam Go?

Mengapa Panggilan Kaedah Rantaian Gagal dengan Penerima Penunjuk dalam Go?

Susan Sarandon
Lepaskan: 2024-11-29 13:03:10
asal
682 orang telah melayarinya

Why Does Chaining Method Calls Fail with Pointer Receivers in 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()
Salin selepas log masuk

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 :

  • Penerima Nilai: Ubah suai Normalize() untuk mempunyai penerima nilai, menghapuskan keperluan untuk mengambil alamat nilai pulangan.
  • Nilai Pulangan Penunjuk: Ubah Suai Tolak() untuk mengembalikan penuding kepada Vector3.
  • Fungsi Pembantu: Cipta fungsi pembantu yang mengembalikan alamat nilai, membenarkan rantaian yang diingini panggilan.

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan