Mengapa Penukaran daripada []rentetan kepada []antara muka{} Gagal dalam Go
In Go, cuba menukar sepotong rentetan ( []rentetan) kepada kepingan antara muka ([]antara muka{}) mencetuskan ralat penyusunan. Ini mengejutkan sesetengah pembangun, memandangkan pemerhatian berikut:
Oleh itu, nampaknya munasabah untuk mengharapkan penukaran berjaya secara automatik. Walau bagaimanapun, ini tidak berlaku kerana susun atur memori yang berbeza bagi dua jenis kepingan.
Reka Letak Memori
Sebuah []hirisan rentetan terdiri daripada tatasusunan yang mengandungi rentetan individu. Sebaliknya, kepingan []antara muka{} menyimpan kedua-dua maklumat jenis dan penunjuk kepada nilai antara muka sebenar. Memandangkan pembolehubah{} antara muka boleh menyimpan nilai jenis yang berbeza, maklumat jenis yang berkaitan adalah penting untuk mendapatkan semula nilai tersebut dengan betul.
Kerumitan Penukaran
Menukar daripada [] rentetan ke []antara muka{} memerlukan menyalin kedua-dua rentetan dan maklumat jenisnya ke lokasi ingatan baharu. Proses ini memakan masa dan terdedah kepada ralat.
Kejelasan dan Penaakulan
Penukaran automatik dalam senario ini akan memperkenalkan potensi kekaburan ke dalam kod. Sebagai contoh, jika fungsi f(s) menerima hujah rentetan [], mengubah suai rentetan dalam s tidak akan memberi kesan pada hirisan yang dihantar ke f. Walau bagaimanapun, jika f sebaliknya mengambil hujah []antara muka{}, pengubahsuaian dalam s akan ditunjukkan dalam kepingan yang diluluskan.
Untuk mengekalkan kejelasan dan mengelakkan tingkah laku yang tidak dijangka, Go melarang penukaran automatik antara kepingan jenis asas yang berbeza. Pembangun mesti mengendalikan penukaran ini secara eksplisit jika dikehendaki, memastikan susun atur memori dan maklumat jenis dikekalkan dengan sewajarnya.
Atas ialah kandungan terperinci Mengapakah Saya Tidak Boleh Menukar Secara Terus `[]rentetan` kepada `[]antara muka{}` dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!