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
Mary-Kate Olsenasal
2024-12-30 13:00:18980semak imbas

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)
}

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!

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