Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Menghantar Tatasusunan CGO ke Go Slice dengan Selamat dan Cekap?

Bagaimanakah Saya Boleh Menghantar Tatasusunan CGO ke Go Slice dengan Selamat dan Cekap?

Susan Sarandon
Susan Sarandonasal
2024-12-06 06:16:23190semak imbas

How Can I Safely and Efficiently Cast a CGO Array to a Go Slice?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn