Rumah >pembangunan bahagian belakang >Golang >Mengapa Saya Boleh Memanggil Kaedah Pergi dengan Penerima Penunjuk Menggunakan Objek Daripada Penunjuk?

Mengapa Saya Boleh Memanggil Kaedah Pergi dengan Penerima Penunjuk Menggunakan Objek Daripada Penunjuk?

DDD
DDDasal
2024-12-28 11:41:21714semak imbas

Why Can I Call a Go Method with a Pointer Receiver Using an Object Instead of a Pointer?

Memanggil Kaedah yang Ditujukan untuk Penunjuk dengan Objek

Dalam Go, adalah mungkin untuk memanggil kaedah yang dimaksudkan untuk penerima penunjuk menggunakan objek bukannya penunjuk kepadanya. Ini mungkin kelihatan luar biasa, tetapi ia dibenarkan mengikut spesifikasi Go.

Pertimbangkan kod berikut:

package main

import "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) // v is not a pointer to a Vertex object
    fmt.Println(v.Abs())
}

Dalam contoh ini, v ialah objek jenis Vertex, dan Skala ialah kaedah yang bertujuan untuk penunjuk ke Puncak. Walau bagaimanapun, daripada menghantar penuding kepada v, kami terus memanggil v.Skala(10).

Mengapa ini bukan ralat? Jawapannya terletak pada peraturan yang ditakrifkan dalam spesifikasi Go untuk panggilan kaedah:

If x is addressable and &x's method set contains m, x.m() is shorthand for (&x).m().

Peraturan ini menyatakan bahawa jika nilai yang dipanggil boleh dialamatkan (iaitu, ia adalah pembolehubah tempatan atau penunjuk), kemudian panggil kaedah padanya adalah sama dengan memanggil kaedah pada alamatnya. Dalam kes ini, v ialah pembolehubah setempat, jadi v.Skala(10) ditafsirkan seolah-olah kita telah menulis (&v).Skala(10) sebaliknya.

Kemudahan ini membolehkan kita menulis dengan lebih bersih dan ringkas kod tanpa perlu membuat penunjuk ke objek secara eksplisit sebelum memanggil kaedah. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa ini hanya berfungsi untuk kaedah dengan penerima penunjuk. Untuk kaedah dengan penerima nilai, menghantar penunjuk ke objek adalah tidak dibenarkan.

Atas ialah kandungan terperinci Mengapa Saya Boleh Memanggil Kaedah Pergi dengan Penerima Penunjuk Menggunakan Objek Daripada 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