Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Go Mengendalikan Panggilan Kaedah dengan Penerima Objek Apabila Kaedah Mempunyai Penerima Penunjuk?

Bagaimanakah Go Mengendalikan Panggilan Kaedah dengan Penerima Objek Apabila Kaedah Mempunyai Penerima Penunjuk?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-23 18:47:12491semak imbas

How Does Go Handle Method Calls with Object Receivers When the Method Has a Pointer Receiver?

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!

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