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
Susan Sarandonasal
2024-11-29 13:03:10577semak imbas

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()

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!

Kenyataan:
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