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

## Mengapakah Saya Boleh Menghubungi Kaedah Penunjuk pada Nilai dalam Go?

Barbara Streisand
Lepaskan: 2024-10-25 13:21:02
asal
394 orang telah melayarinya

## Why Can I Call a Pointer Method on a Value in Go?

Kaedah Go Receiver Memanggil Kekeliruan Sintaks

Dalam bahagian "Penunjuk vs. Nilai" Effective Go, ia menyatakan bahawa "kaedah nilai boleh digunakan pada penunjuk dan nilai , tetapi kaedah penunjuk hanya boleh digunakan pada penunjuk." Ini disebabkan oleh fakta bahawa kaedah penunjuk boleh mengubah suai penerima, dan menggunakannya pada salinan nilai akan menyebabkan pengubahsuaian ini dibuang.

Walau bagaimanapun, sesetengah pembangun telah menghadapi situasi di mana mereka dapat gunakan kaedah penunjuk pada nilai, yang nampaknya bercanggah dengan peraturan sintaks yang didokumenkan. Untuk menjelaskan kekeliruan ini, kami akan meneroka gelagat ini dengan lebih terperinci.

Pertimbangkan kod Go berikut:

<code class="go">package main

import (
  "fmt"
  "reflect"
)

type age int

func (a age) String() string {
  return fmt.Sprintf("%d yeasr(s) old", int(a))
}

func (a *age) Set(newAge int) {
  if newAge >= 0 {
    *a = age(newAge)
  }
}

func main() {
  var vAge age = 5
  pAge := new(age)

  fmt.Printf("TypeOf =>\n\tvAge: %v\n\tpAge: %v\n", reflect.TypeOf(vAge),
    reflect.TypeOf(pAge))

  fmt.Printf("vAge.String(): %v\n", vAge.String())
  fmt.Printf("vAge.Set(10)\n")
  vAge.Set(10)
  fmt.Printf("vAge.String(): %v\n", vAge.String())

  fmt.Printf("pAge.String(): %v\n", pAge.String())
  fmt.Printf("pAge.Set(10)\n")
  pAge.Set(10)
  fmt.Printf("pAge.String(): %v\n", pAge.String())
}</code>
Salin selepas log masuk

Dalam contoh ini, kami mentakrifkan jenis umur dengan dua kaedah: String( ) (kaedah nilai) dan Set() (kaedah penunjuk). Kod ini mencipta dua pembolehubah: vAge, nilai jenis umur dan halaman, penunjuk kepada nilai umur.

Walaupun dokumentasi menunjukkan bahawa vAge.Set() tidak seharusnya menjadi sintaks yang sah, kod tersebut menyusun tanpa kesilapan. Ini kerana vAge boleh dialamatkan, bermakna ia mempunyai alamat memori yang boleh dirujuk. Mengikut spesifikasi bahasa, panggilan kaedah x.m() pada pembolehubah boleh dialamatkan x adalah sah jika set kaedah x mengandungi m.

Dalam kes ini, vAge boleh dialamatkan dan memandangkan set kaedah *umur mengandungi Set (), panggilan vAge.Set() ialah notasi singkatan untuk (&vAge).Set(). Pada asasnya, & operator sedang digunakan secara tersirat untuk mendapatkan penuding kepada vAge.

Oleh itu, kod tersebut menunjukkan bahawa kaedah nilai sememangnya boleh digunakan pada penunjuk kerana memanggilnya pada nilai yang boleh dialamatkan adalah bersamaan dengan memanggil kaedah pada penuding itu nilai. Kaedah penunjuk Set() masih hanya boleh dipanggil pada penunjuk, tetapi dalam kes di mana nilai boleh dialamatkan, penyahrujukan tersirat membolehkan sintaks vAge.Set() menjadi sah.

Atas ialah kandungan terperinci ## Mengapakah Saya Boleh Menghubungi Kaedah Penunjuk pada Nilai 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