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>
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!