Dalam bidang pengaturcaraan, Tour of Go Exercise 51 menghadirkan enigma yang menarik. Kaedah Skala, yang didakwa tidak berkesan apabila menerima nilai Vertex dan bukannya penunjuk, menentang tanggapan ini dalam amalan.
Untuk menjelaskan, kod asal mengisytiharkan v, pembolehubah jenis Vertex, diserahkan kepada Skala sebagai &v . Yang menghairankan, menggantikan &v dengan v secara langsung masih menghasilkan kesan yang boleh diperhatikan pada output.
Menyelidiki mekanik di sebalik fenomena ini, kami mendapati bahawa sistem penaipan kuat Go menguatkuasakan pengisytiharan jenis pembolehubah yang jelas. Apabila fungsi atau kaedah memerlukan penuding kepada jenis tertentu, seperti T, hanya pembolehubah jenis yang tepat itu (T) boleh memenuhi keperluan ini.
Walau bagaimanapun, pengkompil Go mempunyai yang tersembunyi kuasa: dalam keadaan tertentu, ia mengubah kod untuk anda. Satu keadaan sedemikian berlaku apabila pembolehubah bukan penunjuk (x) digunakan untuk menggunakan kaedah (m) yang menerima penerima penunjuk. Di sini, pengkompil campur tangan dan melaksanakan pernyataan (&x).m() dengan berkesan dan bukannya x.m(). Tingkah laku yang menarik ini sejajar dengan dokumentasi Go, yang menyatakan:
"Panggilan kaedah x.m() adalah sah jika set kaedah (jenis) x mengandungi m dan senarai argumen boleh diberikan kepada senarai parameter daripada m. Jika x boleh dialamatkan dan set kaedah &x mengandungi m, x.m() ialah singkatan untuk (&x).m():"
Memahami konsep ini menjelaskan pemerhatian ingin tahu bahawa Skala mengubah suai penerima walaupun diberikan dengan hujah bukan penuding: transformasi senyap pengkompil memastikan tingkah laku yang dimaksudkan berkuat kuasa.
Atas ialah kandungan terperinci Mengapa Pengkompil Go Nampaknya Memberi Penunjuk Secara Tersirat Apabila Kaedah Memanggil?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!