在Go 中使用源自C 程式碼的資料結構時,您可能會遇到需要轉換C-將會樣式數組放入Go 切片中。在這種情況下,根本的問題是:我們能否找到一種比下面笨拙的方法更有效的方法將 CGO 雙精度數組轉換為 float64切片:
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])}
答案在於探索替代轉換技術:
要獲得安全且便攜的解決方案,可以選擇以下方法:
c := [6]C.double{ 1, 2, 3, 4, 5, 6 } fs := make([]float64, len(c)) for i := range c { fs[i] = float64(c[i]) }
此技術迭代CGO 陣列並手動將每個元素分配給切片,確保類型安全。
或者,對於不太傳統且存在潛在風險的解決方案,有:
c := [6]C.double{ 1, 2, 3, 4, 5, 6 } cfa := (*[6]float64)(unsafe.Pointer(&c)) cfs := cfa[:]
這裡,我們利用以下事實: C .double 和float64 都佔用相同的底層記憶體佈局(如果在您的特定場景中確實是這種情況)。使用不安全的指針,我們將 CGO 數組轉換為對應的 float64 數組並對其進行切片。
警告: 這種不安全的方法應謹慎使用,因為如果假設關於記憶體佈局不正確。
以上是如何有效地將 CGO 雙精度數組轉換為 float64 的 Go 切片?的詳細內容。更多資訊請關注PHP中文網其他相關文章!