Rumah >pembangunan bahagian belakang >Golang >Bolehkah Kaedah Penunjuk Dipanggil pada Nilai Bukan Penunjuk dalam Go?

Bolehkah Kaedah Penunjuk Dipanggil pada Nilai Bukan Penunjuk dalam Go?

Patricia Arquette
Patricia Arquetteasal
2024-12-19 22:24:13625semak imbas

Can Pointer Methods Be Called on Non-Pointer Values in Go?

Kaedah Penunjuk pada Jenis Bukan Penunjuk

Jawapan kepada soalan sebelumnya menyatakan bahawa kaedah penunjuk hanya boleh digunakan pada penunjuk. Walau bagaimanapun, ini nampaknya tidak betul, seperti yang ditunjukkan oleh kod berikut yang berjaya memanggil kaedah penuding pada nilai bukan penuding:

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

Penjelasan

Penerangan kunci untuk memahami tingkah laku ini terletak pada hakikat bahawa penerima kaedah adalah penunjuk. Apabila anda memanggil c.fourWheels(), nilai penerima, c, adalah bukan penuding. Walau bagaimanapun, memandangkan jenis penerima ialah penunjuk, ini ditafsirkan sebagai singkatan untuk (&c).fourWheels().

Mengikut spesifikasi Go, apabila memanggil kaedah, jika nilai penerima boleh dialamatkan dan jenis penerima adalah penunjuk, panggilan kaedah ditafsirkan sebagai panggilan kaedah penunjuk. Dalam kes kami, nilai penerima c boleh dialamatkan dan jenis penerima *kereta ialah penunjuk, jadi panggilan kaedah c.fourWheels() secara berkesan memanggil (&c).fourWheels().

Tingkah laku ini ialah konsisten dengan pernyataan bahawa kaedah nilai boleh digunakan pada penunjuk dan nilai, manakala kaedah penunjuk hanya boleh digunakan pada penunjuk. Dalam kes kaedah penunjuk, jika nilai penerima bukan penunjuk, ia mesti dinyahrujuk untuk mendapatkan nilai penunjuk yang boleh digunakan sebagai penerima.

Atas ialah kandungan terperinci Bolehkah Kaedah Penunjuk Dipanggil 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