「cgo」を使用して「const char *」の C 配列に安全にアクセスして Go 文字列に変換するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-11-20 22:59:13
オリジナル
605 人が閲覧しました

How Can I Safely Access and Convert a C Array of `const char *` to Go Strings Using `cgo`?

Cgo を使用して Go から const char * 型の C 配列にアクセスする

Go で const char * 型の C 配列を操作する場合、インデックス付けとエントリを Go 文字列に変換します。この問題は、配列要素へのアクセスに伴う低レベルのポインター演算に起因します。

この課題を克服するには、より安全で便利なアプローチは、C 配列を Go スライスに変換することです。この中間ステップにより、精度を確保しながら変換プロセスが簡素化されます。

C 配列を Go スライスに変換する

arraySize := 3
cStrings := (*[1 << 30]*C.char)(unsafe.Pointer(&C.myStringArray))[:arraySize:arraySize]
ログイン後にコピー

この操作により次のことが実現されます:

  • arraySize配列内の要素の数を定義します。
  • *C.char は C char 型へのポインタを宣言します。
  • unsafe.Pointer(&C.myStringArray) は最初の要素のメモリ アドレスを取得しますmyStringArray 配列内に。
  • [:arraySize:arraySize] は、arraySize のストライドで、同じ C 配列要素を指す Go スライスを作成します。

スライスの反復と変換エントリ

C 配列がスライスに変換されると、それを反復処理するのが簡単になります。以下に例を示します。

for _, cString := range cStrings {
    fmt.Println(C.GoString(cString))
}
ログイン後にコピー

このループは、C.GoString() を使用して Go 文字列に変換した後、C 配列の各要素を出力します。

サンプル出力

NAME_OF_FIRST_THING
NAME_OF_SECOND_THING
NAME_OF_THIRD_THING
ログイン後にコピー

このアプローチに従うことで、直接ポインター算術の複雑さを回避しながら、const char * 型の C 配列の要素を効果的にインデックス付けして Go 文字列に変換できます。

以上が「cgo」を使用して「const char *」の C 配列に安全にアクセスして Go 文字列に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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