首頁 > 後端開發 > Golang > 如何有效地將 CGO 雙精度數組轉換為 float64 的 Go 切片?

如何有效地將 CGO 雙精度數組轉換為 float64 的 Go 切片?

Linda Hamilton
發布: 2024-12-13 11:13:22
原創
492 人瀏覽過

How to Efficiently Cast a CGO Array of Doubles to a Go Slice of float64?

在Go 中將CGO 陣列轉換為切片

在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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板