Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Go Mengendalikan Panggilan Kaedah dengan Penerima Objek Apabila Kaedah Mempunyai Penerima Penunjuk?
Panggilan Kaedah dengan Penerima Objek Berbanding Penunjuk
Dalam Go, kaedah boleh ditakrifkan untuk jenis dengan penerima nilai (bukan penunjuk) atau penuding penerima (penunjuk). Apabila memanggil kaedah dengan penerima penuding oleh objek, Go secara automatik mentafsir panggilan seolah-olah ia dibuat pada penuding ke objek.
Sebagai contoh, pertimbangkan kod berikut:
package main import ( "fmt" "math" ) type Vertex struct { X, Y float64 } func (v Vertex) Abs() float64 { return math.Sqrt(v.X*v.X + v.Y*v.Y) } func (v *Vertex) Scale(f float64) { v.X = v.X * f v.Y = v.Y * f } func main() { v := Vertex{3, 4} v.Scale(10) // Calling a method with a pointer receiver using an object fmt.Println(v.Abs()) }
Di sini, kami mempunyai jenis Vertex dengan kedua-dua kaedah nilai dan penerima penunjuk. Dalam fungsi utama, kami mencipta objek Vertex v dan kemudian memanggil kaedah Skala padanya. Biasanya, kaedah Skala menjangkakan penerima penunjuk, tetapi dalam kes ini, kami menggunakan objek.
Pengkompil menyedari bahawa v boleh ditangani dan set kaedahnya termasuk Skala. Mengikut spesifikasi Go:
"Panggilan kaedah x.m() adalah sah jika set kaedah (jenis) x mengandungi m dan senarai argumen boleh diberikan kepada senarai parameter m. Jika x boleh dialamatkan dan set kaedah &x mengandungi m, x.m() ialah singkatan untuk (&x).m()."
Oleh itu, panggilan v.Scale(10) ialah ditafsirkan sebagai (&v).Skala(10), yang secara berkesan menghantar penunjuk ke objek v kepada kaedah Skala. Ini membenarkan kaedah untuk mengubah suai medan X dan Y objek seperti yang dijangkakan.
Atas ialah kandungan terperinci Bagaimanakah Go Mengendalikan Panggilan Kaedah dengan Penerima Objek Apabila Kaedah Mempunyai Penerima Penunjuk?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!