型破りなキャスト: CGO 配列を Go スライスに変換する
Go で CGO を使用する場合、CGO 配列をキャストする必要が生じる場合があります。 Go スライスに変換します。従来、これには、配列を反復処理し、各要素を個別にキャストすることによる手動変換が必要でした。
ただし、このタスクには、より効率的で型破りなアプローチが存在します。
安全で簡単な方法:
より安全で推奨されるアプローチは、for ループを使用して CGO の各要素を手動でキャストすることです。 array:
c := [6]C.double{1, 2, 3, 4, 5, 6} fs := make([]float64, len(c)) for i := range c { fs[i] = float64(c[i]) }
このメソッドは型の安全性と移植性を保証します。
型破りだが効率的なメソッド:
速度と効率を高めるために、より大胆なメソッド既知の安全でない型キャストのアプローチを使用できます:
c := [6]C.double{1, 2, 3, 4, 5, 6} cfa := (*[6]float64)(unsafe.Pointer(&c)) cfs := cfa[:]
Thisこの手法は、C.double と float64 が同じ基礎となる型を共有するという前提に基づいています。これには、CGO 配列へのポインタを取得し、それを同じサイズの float64 配列へのポインタに安全にキャストし、最後にその配列のスライスを取得することが含まれます。
注意事項と考慮事項:
安全でない変換方法は高速である可能性がありますが、未定義の動作やプラットフォームへの依存性が発生する可能性があるという注意が必要です。このアプローチを採用する前に、C.double と float64 の基礎となる型に実際に互換性があることを確認することが重要です。さらに、このテクニックは必要な場合にのみ、細心の注意を払って使用することが重要です。
以上がCGO 配列を Go スライスに効率的に変換する方法: 安全な方法と安全でない方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。