Rumah > pembangunan bahagian belakang > Golang > Mengapakah Saya Boleh Memanggil Kaedah Penunjuk pada Nilai Bukan Penunjuk dalam Go?

Mengapakah Saya Boleh Memanggil Kaedah Penunjuk pada Nilai Bukan Penunjuk dalam Go?

Mary-Kate Olsen
Lepaskan: 2024-12-30 13:00:18
asal
977 orang telah melayarinya

Why Can I Call Pointer Methods on Non-Pointer Values in Go?

Seruan Kaedah Penunjuk pada Nilai Bukan Penunjuk

Dalam Go, adalah mungkin untuk menggunakan kaedah penuding pada nilai bukan penuding, walaupun peraturan am bahawa kaedah penunjuk hanya boleh digunakan pada penunjuk. Tingkah laku yang kelihatan bercanggah ini boleh dijelaskan oleh konsep penyahrujukan penunjuk automatik.

Dalam coretan kod yang diberikan:

package main

import "fmt"

type car struct {
    wheels int
}

func (c *car) fourWheels() {
    c.wheels = 4
}

func main() {

    var c = car{}
    fmt.Println("Wheels:", c.wheels)
    c.fourWheels()
    fmt.Println("Wheels:", c.wheels)
}
Salin selepas log masuk

Ungkapan c.fourWheels() ialah singkatan untuk (&c) .fourWheels(). Ini kerana penerima fourWheels ialah penunjuk, dan c ialah nilai bukan penunjuk. Memandangkan c boleh dialamatkan, pengkompil secara automatik membatalkan rujukannya untuk mendapatkan penunjuk kepada nilai kereta, yang kemudiannya digunakan sebagai penerima.

Tingkah laku ini dinyatakan secara jelas dalam spesifikasi Go:

Jika x boleh dialamatkan dan set kaedah &x mengandungi m, x.m() ialah singkatan untuk (&x).m().

Oleh itu, sementara peraturan am tentang kaedah penuding kekal sah, penyahrujukan penunjuk automatik membenarkan penggunaan kaedah penuding yang mudah pada nilai bukan penuding dalam situasi tertentu. Adalah penting untuk ambil perhatian bahawa tingkah laku ini hanya digunakan pada kaedah dengan penerima penunjuk.

Atas ialah kandungan terperinci Mengapakah Saya Boleh Memanggil Kaedah Penunjuk pada Nilai Bukan Penunjuk dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan