cgo を使用して Go で C Char 配列にアクセスする
C では、定数文字ポインターの配列 (例: const char *myStringArray) が頻繁に発生します。 [])。 cgo を使用して Go からそのような配列にアクセスするのは難しい場合があります。
間違ったアプローチ:
最初は、安全でないポインタ演算を使用して配列に直接インデックスを付けようとする可能性があります:
myGoString := C.GoString((*C.char) (unsafe.Pointer(uintptr(unsafe.Pointer(C.myStringArray)) + uintptr(index) * unsafe.Sizeof(C.myStringArray))))
ただし、このアプローチでは、配列ではなく文字列内の文字間を移動します。
正しい解決策:
より信頼性の高い解決策には、C 配列を Go スライスに変換することが含まれます。
// Define array size arraySize := 3 // Create Go slice cStrings := (*[1 << 30]*C.char)(unsafe.Pointer(&C.myStringArray))[:arraySize:arraySize] // Iterate over slice for _, cString := range cStrings { fmt.Println(C.GoString(cString)) }
このアプローチにより、適切な処理が保証されます。配列のインデックスを作成し、各文字列要素全体へのアクセスを提供します。
ポインタの複雑さを理解することによってGo スライスの操作とユーティリティを利用することで、C と Go のメモリ構造間のギャップを効果的に埋めることができます。
以上がcgo を使用して Go で C Char 配列に安全にアクセスする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。