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

Mengapa Kaedah Penunjuk Boleh Dipanggil pada Nilai Bukan Penunjuk dalam Go?

Patricia Arquette
Patricia Arquetteasal
2024-12-27 11:49:11808semak imbas

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

Kaedah Penunjuk pada Jenis Bukan Penunjuk Dijelaskan

Dalam Go, konvensyen menyatakan bahawa kaedah nilai boleh digunakan pada kedua-dua penunjuk dan nilai, manakala kaedah penunjuk adalah terhad kepada penunjuk. Walau bagaimanapun, pengecualian jelas kepada peraturan ini ialah keupayaan untuk melaksanakan kaedah penuding pada nilai bukan penuding.

Pertimbangkan coretan kod berikut:

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()
    // Here, a pointer method is invoked on a non-pointer value
    fmt.Println("Wheels:", c.wheels)
}

Kod berjaya melaksanakan kaedah penuding fourWheels pada nilai bukan penunjuk c. Ini mungkin kelihatan bercanggah dengan peraturan yang ditetapkan.

Sebenarnya, apabila menggunakan kaedah fourWheels pada nilai bukan penuding c, anda menggunakan tatatanda trengkas. Ungkapan c.fourWheels() adalah bersamaan dengan (&c).fourWheels().

Spesifikasi Go menyatakan: "Jika x boleh dialamatkan dan set kaedah & x mengandungi m, x.m() ialah singkatan untuk ( &x).m()."

Dalam erti kata lain, Go secara tersirat menyahrujuk nilai bukan penuding c untuk mendapatkan penuding kepada ia, yang kemudiannya digunakan sebagai penerima untuk kaedah penunjuk.

Untuk menjelaskan peraturan tentang kaedah penunjuk, ia harus ditafsirkan seperti berikut:

  • Kaedah nilai boleh digunakan pada kedua-dua nilai dan penunjuk.
  • Kaedah penunjuk boleh digunakan pada penunjuk dan, dalam kes tertentu, pada nilai bukan penunjuk, tetapi hanya jika nilai bukan penuding boleh diakses secara tidak langsung melalui penuding.

Atas ialah kandungan terperinci Mengapa Kaedah Penunjuk Boleh 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