Ketidakupayaan untuk menukar kepingan jenis yang berbeza, seperti yang ditunjukkan oleh coretan kod yang disediakan, adalah disebabkan oleh penukaran jenis tertentu peraturan yang digariskan dalam spesifikasi Go. Peraturan ini mengawal apabila nilai bukan pemalar boleh ditukar kepada jenis tertentu.
Tiada satu pun peraturan penukaran terpakai pada kes di mana anda cuba menukar kepingan Bar kepada kepingan Foo. Walaupun jenis asas Foo dan Bar adalah sama, jenis asas kepingan masing-masing tidak. Ini mengakibatkan ketidakupayaan untuk memberikan nilai []Foo kepada pembolehubah jenis []Bar.
Memahami Jenis Pendasar
Adalah penting untuk ambil perhatian bahawa pendasar jenis pembolehubah tidak semestinya sama dengan jenis pembolehubah itu sendiri. Dalam kes kepingan, jenis elemen ialah jenis asas. Oleh itu, walaupun Foo dan Bar mempunyai jenis asas yang sama (Foo), []Foo dan []Bar tidak.
Penyelesaian Praktikal
Untuk menangani isu ini , anda boleh mencipta jenis perantaraan yang alias Bar sebagai Foo. Pendekatan ini berfungsi kerana jenis elemen hirisan kekal sama. Contohnya:
<code class="go">type Foo struct { A int } type Bar Foo type Foos []Foo type Bars Foos func main() { foos := []Foo{Foo{1}, Foo{2}} bars := Bars(foos) fmt.Println(bars) }</code>
Output:
[{1} {2}]
Penyelesaian ini mencipta kepingan dengan jenis elemen asas yang sama, membolehkan penukaran antara mereka.
Pertimbangan Tidak Selamat
Sebagai nota berhati-hati, walaupun secara teknikal mungkin untuk "melihat" sekeping Foo sebagai sekeping Bar menggunakan operasi yang tidak selamat, pendekatan ini memintas keselamatan jenis. Adalah disyorkan untuk menggunakan pendekatan penyalian jenis yang digariskan di atas untuk keselamatan dan kebolehpercayaan.
Atas ialah kandungan terperinci Mengapa Anda Tidak Boleh Menukar Kepingan Pelbagai Jenis dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!