Rumah >pembangunan bahagian belakang >Golang >Mengapakah Saya Tidak Boleh Menukar Sekeping `Foo` kepada Sekeping `Bar` dalam Go?
Mengapa Go Tidak Membenarkan Penukaran Jenis Slice (cth. []Foo to []Bar)
Pengenalan
Dalam Go, memberikan satu nilai kepada pembolehubah jenis yang berbeza biasanya tidak dibenarkan kerana peraturan keselamatan dan penukaran jenis. Seperti yang anda temui, anda tidak boleh menukar kepingan struktur satu jenis (cth. []Foo) kepada kepingan jenis yang berbeza (cth. []Bar). Artikel ini bertujuan untuk menjelaskan sebab penukaran ini tidak boleh dilakukan, walaupun jenis asas Foo dan Bar mungkin sama.
Peraturan Penukaran
Mengikut spesifikasi Go , nilai x tidak tetap boleh ditukar kepada jenis T hanya jika salah satu daripada kriteria berikut dipenuhi:
Jenis Kepingan Dasar
Jenis asas hirisan ialah penunjuk kepada jenis elemen. Sebagai contoh, jenis asas []Foo ialah []Foo, dan jenis asas []Bar ialah []Bar. Walaupun jenis asas Foo adalah sama dengan jenis asas Bar, ini tidak diterjemahkan kepada jenis asas yang sama untuk kepingan Foo dan Bar.
Sebab Tidak Penukaran
Penyelesaian AlternatifSatu penyelesaian yang mungkin untuk isu ini adalah dengan mentakrifkan alias jenis tersuai untuk sepotong Foo, seperti Foos. Ini membolehkan anda membuat kepingan Bar daripada kepingan Foos, seperti yang digambarkan dalam kod berikut:
Dalam kes ini, jenis asas Foos dan Bar adalah sama dan penukaran berfungsi sebagai dijangka.<code class="go">type Foo struct{ A int } type Foos []Foo type Bars Foos func main() { foos := []Foo{Foo{1}, Foo{2}} bars := Bars(foos) fmt.Println(bars) }</code>Pertimbangan Pakej Tidak Selamat
Walaupun Go secara amnya melarang operasi yang tidak selamat, adalah mungkin untuk menggunakan pakej yang tidak selamat untuk memintas sekatan penukaran. Walau bagaimanapun, ini harus dilakukan dengan berhati-hati dan memahami kemungkinan akibat, kerana ia boleh menjejaskan keselamatan jenis.
KesimpulanMemahami peraturan penukaran dan jenis asas kepingan ialah penting untuk mengendalikan penukaran jenis dalam Go. Walaupun penukaran terus antara kepingan jenis elemen berbeza tidak dibenarkan, terdapat penyelesaian alternatif, seperti menentukan alias jenis tersuai, untuk mencapai kefungsian yang diingini sambil mengekalkan keselamatan jenis.
Atas ialah kandungan terperinci Mengapakah Saya Tidak Boleh Menukar Sekeping `Foo` kepada Sekeping `Bar` dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!