Menghantar Array CGO ke dalam Go Slice: Alternatif yang Lebih Baik
Dalam Go, menukar tatasusunan CGO kepada kepingan boleh dilakukan secara manual melontar setiap elemen, seperti yang ditunjukkan dalam soalan. Walau bagaimanapun, pendekatan ini boleh menyusahkan. Berikut ialah kaedah yang lebih mudah:
c := [6]C.double{1, 2, 3, 4, 5, 6} fs := make([]float64, len(c)) for i, v := range c { fs[i] = float64(v) }
Versi ini mengelakkan keperluan untuk menghantar setiap elemen secara manual. Sebaliknya, ia melelang ke atas tatasusunan CGO menggunakan gelung julat, menukar setiap elemen secara automatik kepada float64.
Penghantaran Tidak Selamat (Tidak Disyorkan)
Sebagai alternatif, penunjuk tidak selamat pelakon boleh digunakan untuk mencapai penukaran:
cfa := (*[6]float64)(unsafe.Pointer(&c)) cfs := cfa[:]
Pendekatan ini merujuk kepada CGO tatasusunan, menghantarnya secara tidak selamat ke penuding ke tatasusunan float64, dan kemudian memotong tatasusunan yang terhasil. Walaupun kaedah ini mungkin lebih pantas, ia dianggap tidak selamat kerana ia memintas pemeriksaan keselamatan memori Go.
Kesimpulan
Walaupun kaedah pemutus yang tidak selamat lebih pantas, adalah penting untuk mengutamakan memori keselamatan dalam kod pengeluaran. Kaedah yang lebih selamat dan mudah ialah dengan mengulang tatasusunan secara manual dan melakukan penukaran secara eksplisit.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menukar Tatasusunan CGO dengan Cekap kepada Go Slice?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!