ホームページ > バックエンド開発 > Golang > Double の CGO 配列を float64 の Go スライスに効率的にキャストするにはどうすればよいですか?

Double の 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 スライスに追加します。このコンテキストでの根本的な質問は、double の 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 配列にキャストし、スライスします。

注意: この安全でないアプローチは、前提条件が満たされていない場合に未定義の動作を引き起こす可能性があるため、注意して使用する必要があります。メモリレイアウトについて間違っています。

以上がDouble の CGO 配列を float64 の Go スライスに効率的にキャストするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート