Rumah >pembangunan bahagian belakang >Golang >Mengapakah Kaedah Penerima Nilai Boleh Digunakan pada Penunjuk dalam Go, Tetapi Bukan Sebaliknya?
Kaedah Penerima Nilai vs. Penerima Penunjuk dalam Go: Memahami Reka Bentuk dan Rasional
Dalam Go, kaedah boleh ditakrifkan dengan sama ada penerima nilai (T) atau penerima penunjuk (T). Walaupun kaedah yang ditakrifkan pada T boleh menjejaskan salinan T, kaedah yang ditakrifkan pada T mempengaruhi data sebenar yang dirujuk oleh T.
Mengapa Kaedah pada Penerima Nilai Juga Boleh Digunakan Oleh Penerima Penunjuk
Kaedah yang ditakrifkan pada T boleh digunakan pada T kerana Go secara automatik menafikan penunjuk apabila menghantar argumen kepada fungsi. Contohnya, jika anda mempunyai kaedah yang ditakrifkan pada int:
<code class="go">func (n *int) Add(x int) { *n += x }</code>
Anda boleh memanggil kaedah ini pada kedua-dua *int dan int:
<code class="go">var n int ptr := &n ptr.Add(5) // Call Add on *int n.Add(5) // Automatically dereferences ptr when calling Add on int</code>
Mengapa Kaedah pada Penerima Penunjuk Tidak Boleh Digunakan Oleh Penerima Nilai
Kaedah yang ditakrifkan pada *T tidak boleh digunakan pada T kerana Go tidak merujuk nilai secara automatik apabila menghantar argumen kepada fungsi. Untuk membuat penunjuk kepada nilai, anda perlu mengambil alamatnya secara eksplisit menggunakan & operator:
<code class="go">var n int ptr := &n</code>
Walau bagaimanapun, ini mungkin tidak selalu dapat dilakukan. Sebagai contoh, jika T disimpan dalam peta atau dikembalikan daripada fungsi, alamatnya mungkin tidak statik atau boleh diakses.
Kebaikan dan Keburukan Reka Bentuk
Ini reka bentuk memberikan beberapa faedah:
Walau bagaimanapun, ia juga mempunyai kelemahan:
Atas ialah kandungan terperinci Mengapakah Kaedah Penerima Nilai Boleh Digunakan pada Penunjuk dalam Go, Tetapi Bukan Sebaliknya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!