Keliru dengan cadangan dalam panduan rasmi Go untuk menggunakan jenis penerima yang sama untuk semua kaedah

PHPz
Lepaskan: 2024-02-10 10:42:08
ke hadapan
689 orang telah melayarinya

对 Go 官方指南中关于所有方法使用相同类型接收器的建议感到困惑

editor php Baicao keliru dengan cadangan dalam panduan rasmi Go untuk menggunakan jenis penerima yang sama untuk semua kaedah. Dalam proses pembelajaran bahasa Go, kami sering menghadapi cadangan bahawa jenis penerima harus konsisten apabila kaedah ditakrifkan. Walau bagaimanapun, cadangan ini menimbulkan beberapa persoalan dalam aplikasi praktikal. Untuk lebih memahami maksud dan tujuan cadangan ini, kami akan menerokainya secara mendalam dan cuba mencari penjelasan yang munasabah.

Kandungan soalan

Saya cuba belajar Pergi melalui tutorial Go rasmi dan saya mendapati bahagian terakhir bahagian tentang nilai vs penerima penunjuk mengelirukan:

Secara umum, semua kaedah pada jenis tertentu harus mempunyai sama ada penerima nilai atau penerima penunjuk, tetapi bukan kedua-duanya. (Kami akan mengetahui sebabnya dalam beberapa halaman seterusnya.)

Secara asasnya, saya ada dua soalan:

A) Nampaknya saya tidak dapat mencari sebab mengapa kita tidak perlu mencampurkan kedua-dua jenis penerima untuk seluruh bab ini, jadi jika sesiapa boleh menerangkan atau memetik bahagian di mana perkara ini dibincangkan, saya akan berterima kasih.

B) Dengan mengandaikan bahawa mencampurkan penunjuk dan penerima nilai sememangnya idea yang tidak baik, bagaimanakah anda melaksanakan antara muka yang berbeza? Sebagai contoh, saya mendapati bahawa tutorial ini menerangkan dua antara muka terbina dalam yang berbeza, iaitu antara muka Stringererror。在为 Stringer 提供的代码中,使用了值接收器,并且切换到指针接收器似乎不起作用,而在 error, di mana penerima penunjuk digunakan. Bagaimanakah saya boleh melaksanakan kedua-dua antara muka ini untuk struct tanpa melanggar prinsip di atas.

Sila ambil perhatian bahawa saya telah meneliti soalan yang sama mengenai keburukan menggunakan penerima nilai berbanding penerima penunjuk (cth. penciptaan objek), dan kepentingan mengekalkan konsistensi (daripada soalan ini), tetapi memandangkan saya seorang Scholars For Go yang masih baru, saya hanya cuba menggabungkannya dengan maklumat/contoh daripada lawatan rasmi Go.

Terima kasih!

Penyelesaian

Untuk masalah pertama, mempunyai kedua-dua penerima nilai dan penerima penunjuk boleh menyebabkan perlumbaan halus, kerana penerima nilai menyalin objek. Contohnya:

type T struct {
  field int
}

func (T) ValueReceiver() int {return 1}

func (t *T) SetField(i int) {t.field=i}
Salin selepas log masuk

Dalam contoh di atas, jika anda memanggil kedua-duanya SetFieldValueReceiver,则您将进行一场竞赛。这是因为,当 SetField 写入字段时,ValueReceiver salinan penerima sedang dibuat, menyebabkan medan yang sama dibaca tanpa sebarang penyegerakan yang jelas.

Untuk soalan kedua: Jika anda telah mengubah suai semua antara muka T 的方法,那么让所有方法都使用指针接收器是有意义的。这样您就可以防止微妙的竞争,并实现 T.

Berikut ialah pautan kepada Soalan Lazim mengenai topik ini (terima kasih @jub0bs):

https://www.php.cn/link/bcc097feafe80f489ef54b0720ca059c

Contoh ini berdasarkan siaran berikut:

https://dave.cheney .net/2015/11/18/wednesday-pop-quiz-spot-the-race

Atas ialah kandungan terperinci Keliru dengan cadangan dalam panduan rasmi Go untuk menggunakan jenis penerima yang sama untuk semua kaedah. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!