Rumah >pembangunan bahagian belakang >Golang >Mengapa Kaedah Go dengan Penerima Penunjuk Nampaknya Mengubah Suai Nilai Bukan Penunjuk?

Mengapa Kaedah Go dengan Penerima Penunjuk Nampaknya Mengubah Suai Nilai Bukan Penunjuk?

Susan Sarandon
Susan Sarandonasal
2024-12-05 17:26:11322semak imbas

Why Does Go's Method with a Pointer Receiver Seem to Modify Non-Pointer Values?

Kaedah dengan Penerima Penunjuk

Dalam Tour of Go, Latihan 51 meneroka penerima kaedah. Penjelasan yang diberikan menyatakan bahawa kaedah Skala, yang beroperasi pada penunjuk ke Puncak, tidak mempunyai kesan apabila ia menerima nilai Pucuk secara langsung. Walau bagaimanapun, mengubah suai fungsi utama untuk menghantar Vertex bukan penuding bercanggah dengan pernyataan ini.

Mengapa Percanggahan?

Walaupun kod menerima nilai bukan penuding, Skala berjaya mengubah suai pembolehubah. Tingkah laku ini boleh dikaitkan dengan sistem menaip Go yang kuat. Apabila penunjuk kepada T dijangka dalam konteks tertentu, hanya penunjuk kepada T (*T) boleh memenuhi keperluan tersebut.

Pengkompil menggunakan transformasi di belakang tabir untuk membolehkan tingkah laku ini:

"Panggilan kaedah x.m() adalah sah jika set kaedah (jenis) x mengandungi m dan senarai argumen boleh diberikan kepada senarai parameter m. Jika x ialah boleh dialamatkan dan set kaedah &x mengandungi m, x.m() ialah singkatan untuk (&x).m():"

Pada dasarnya, pengkompil menulis semula kod untuk menghantar penunjuk kepada nilai bukan penunjuk apabila penerima pembolehubah mempunyai jenis penerima penunjuk. Ini membolehkan kaedah Skala mengubah suai pembolehubah asal.

Atas ialah kandungan terperinci Mengapa Kaedah Go dengan Penerima Penunjuk Nampaknya Mengubah Suai Nilai Bukan Penunjuk?. 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