Memahami mengapa pengkompil melarang penukaran langsung hirisan rentetan kepada hirisan jenis tersuai, seperti dalam contoh yang diberikan, adalah penting untuk pembangun yang bekerja dengan Go.
Dalam kod contoh, ketidakupayaan untuk menukar []hirisan rentetan (nilai) kepada hirisan Tangan (firstHand) berpunca daripada keputusan spesifikasi Go. Berbanding membenarkan penukaran kasual antara jenis yang berkongsi struktur serupa tetapi tidak mempunyai ciri yang berkaitan, Pilihlah pendirian ini untuk keselamatan yang lebih baik.
Untuk memastikan integriti data, penyelesaian yang disyorkan adalah dengan menyalin kepingan secara manual. Walau bagaimanapun, bagi pengguna lanjutan yang menyedari risiko yang terlibat, pakej tidak selamat menyediakan kaedah untuk melakukan penukaran secara langsung. Pendekatan ini melibatkan penggunaan tidak selamat.Penunjuk untuk menukar alamat kepingan sumber kepada alamat kepingan sasaran dan membatalkan rujukannya.
value := []string{"a", "b", "c"} // convert &value (type *[]string) to *[]Card via unsafe.Pointer, then deref cards := *(*[]Card)(unsafe.Pointer(&value)) firstHand := NewHand(cards)
Walaupun kaedah penukaran langsung ini menghapuskan keperluan untuk menyalin, ia memerlukan berhati-hati, kerana dokumentasi Go menekankan bahawa operasi dengan tidak selamat.Penunjuk berpotensi mengganggu sistem jenis, yang membawa kepada membaca atau menulis memori sewenang-wenangnya. Oleh itu, penggunaannya harus dikhaskan untuk senario yang sangat terhad dan terkawal.
Selain itu, terdapat perbincangan awal mengenai potensi perubahan pada spesifikasi berkenaan penukaran antara jenis dengan struktur asas yang setara, tetapi cadangan ini belum lagi diterima masuk ke dalam Go. Akibatnya, pendekatan yang lebih selamat dan disyorkan kekal sebagai penyalinan hirisan manual apabila berurusan dengan jenis tersuai untuk menjamin tingkah laku yang betul dan boleh diramal.
Atas ialah kandungan terperinci Mengapakah Saya Tidak Boleh Menukar Secara Terus Kepingan Rentetan kepada Kepingan Jenis Tersuai dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!