Apabila bekerja dengan struktur data yang berasal daripada kod C dalam Go, anda mungkin menghadapi keperluan untuk menukar C- tatasusunan gaya ke dalam kepingan Go. Dalam konteks ini, persoalan asasnya ialah: bolehkah kita mencari cara yang lebih cekap untuk membuang tatasusunan beregu CGO ke dalam kepingan float64 daripada kaedah kekok di bawah:
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])}
Jawapannya terletak pada penerokaan pemutus alternatif teknik:
Untuk penyelesaian yang selamat dan mudah alih, seseorang boleh memilih yang berikut pendekatan:
c := [6]C.double{ 1, 2, 3, 4, 5, 6 } fs := make([]float64, len(c)) for i := range c { fs[i] = float64(c[i]) }
Teknik ini berulang pada tatasusunan CGO dan secara manual memperuntukkan setiap elemen pada kepingan, memastikan keselamatan jenis.
Sebagai alternatif, untuk penyelesaian yang kurang konvensional dan berpotensi berisiko, terdapat:
c := [6]C.double{ 1, 2, 3, 4, 5, 6 } cfa := (*[6]float64)(unsafe.Pointer(&c)) cfs := cfa[:]
Di sini, kami mengeksploitasi fakta bahawa kedua-dua C.double dan float64 menduduki susun atur memori asas yang sama (jika ini benar-benar berlaku dalam senario khusus anda). Menggunakan penunjuk tidak selamat, kami menghantar tatasusunan CGO ke tatasusunan float64 yang sepadan dan menghirisnya.
Awas: Pendekatan tidak selamat ini harus digunakan dengan berhati-hati kerana ia boleh membawa kepada tingkah laku yang tidak ditentukan jika andaian tentang susun atur memori tidak betul.
Atas ialah kandungan terperinci Bagaimana untuk Melancarkan Tatasusunan CGO Beregu dengan Cekap kepada Sekeping Go float64?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!