將CGO 陣列轉換為Go 切片:更好的替代方案
在Go 中,將CGO 陣列轉換為切片完成投射每個元素,如問題所示。然而,這種方法可能很麻煩。這裡有一個更方便的方法:
c := [6]C.double{1, 2, 3, 4, 5, 6} fs := make([]float64, len(c)) for i, v := range c { fs[i] = float64(v) }
這個版本避免了手動轉換每個元素的需要。相反,它使用範圍循環迭代 CGO 數組,自動將每個元素轉換為 float64。
不安全轉換(不建議)
或者,不安全指標可以使用cast來實現轉換:
cfa := (*[6]float64)(unsafe.Pointer(&c)) cfs := cfa[:]
這種方法需要一個指向CGO數組的指針,不安全地將其轉換為指向float64 數組的指針,然後對結果數組進行切片。雖然此方法可能更快,但它被認為是不安全的,因為它繞過了 Go 的記憶體安全檢查。
結論
雖然不安全的轉換方法更快,但優先考慮記憶體很重要安全生產程式碼。更安全、更直接的方法是手動迭代數組並明確執行轉換。
以上是如何有效率地將CGO數組轉換為Go切片?的詳細內容。更多資訊請關注PHP中文網其他相關文章!