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 サイトの他の関連記事を参照してください。