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

CGO 配列を Go スライスに安全かつ効率的にキャストするにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-06 06:16:23190ブラウズ

How Can I Safely and Efficiently Cast a CGO Array to a Go Slice?

CGO 配列を Go スライスにキャスト: より安全で狡猾なアプローチを探る

Go では、CGO 配列と Go スライス間のギャップを埋める繰り返しの課題になる可能性があります。一般的なアプローチでは、次の例に示すように、各 CGO 配列要素を目的の Go タイプに手動でキャストします。

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])}

このメソッドは機能しますが、退屈でエラーが発生しやすい可能性があります。同じ結果を達成するための、より効率的で信頼性の高い方法はありますか?

安全でポータブルなキャスト

簡単なアプローチの 1 つは、for ループを利用して各 CGO 配列を明示的に変換することです。 element:

c := [6]C.double{1, 2, 3, 4, 5, 6}
fs := make([]float64, len(c))
for i := range c {
  fs[i] = float64(c[i])
}

このメソッドは、異なるタイプ間での型の安全性と移植性を保証します。

安全でない狡猾な策略

あるいは、より型破りなソリューションでは、Go の安全でないパッケージとポインター操作を利用します。

c := [6]C.double{1, 2, 3, 4, 5, 6}
cfa := (*[6]float64)(unsafe.Pointer(&c))
cfs := cfa[:]

CGO 配列を float64 配列へのポインターとして使用します (基になる型の互換性を前提としています)。明示的なキャストを行わずにスライスを取得できます。ただし、この方法は安全でない操作に依存しているため、慎重に扱う必要があります。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。