Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Menghantar Tatasusunan CGO ke Go Slice dengan Selamat dan Cekap?
Menghantar Array CGO ke Go Slice: Meneroka Pendekatan Lebih Selamat dan Licik
Dalam Go, merapatkan jurang antara tatasusunan CGO dan kepingan Go boleh menjadi cabaran yang berulang. Pendekatan biasa melibatkan menghantar secara manual setiap elemen tatasusunan CGO kepada jenis Go yang diingini, seperti yang dilihat dalam contoh berikut:
doubleSlc := [6]C.double{} // Fill doubleSlc floatSlc := []float64{float64(doubleSlc[0]), float64(doubleSlc[1]), float64(doubleSlc[2]), float64(doubleSlc[3]), float64(doubleSlc[4]), float64(doubleSlc[5])}
Walaupun berfungsi, kaedah ini boleh membosankan dan terdedah kepada ralat. Adakah terdapat cara yang lebih cekap dan boleh dipercayai untuk mencapai hasil yang sama?
Penghantaran Selamat dan Mudah Alih
Satu pendekatan mudah ialah menggunakan gelung for untuk menukar secara eksplisit setiap tatasusunan CGO elemen:
c := [6]C.double{1, 2, 3, 4, 5, 6} fs := make([]float64, len(c)) for i := range c { fs[i] = float64(c[i]) }
Kaedah ini memastikan keselamatan jenis dan mudah alih merentas platform.
Tipuan Tidak Selamat dan Licik
Sebagai alternatif, penyelesaian yang lebih tidak ortodoks memanfaatkan pakej tidak selamat dan manipulasi penunjuk Go:
c := [6]C.double{1, 2, 3, 4, 5, 6} cfa := (*[6]float64)(unsafe.Pointer(&c)) cfs := cfa[:]
Dengan merawat Tatasusunan CGO sebagai penunjuk kepada tatasusunan float64 (dengan mengandaikan jenis asas keserasian), kita boleh mendapatkan kepingan tanpa pemutus eksplisit. Walau bagaimanapun, kaedah ini bergantung pada operasi yang tidak selamat dan harus dikendalikan dengan berhati-hati.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghantar Tatasusunan CGO ke Go Slice dengan Selamat dan Cekap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!