ホームページ >バックエンド開発 >Golang >cgo を使用して Go で `const char*` の C 配列にアクセスする方法は?

cgo を使用して Go で `const char*` の C 配列にアクセスする方法は?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-05 18:34:11234ブラウズ

How to Access a C Array of `const char*` in Go using cgo?

cgo を介して Go から const char* の C 配列にアクセスする

cgo を介して Go コードに const char* の配列を組み込むのは困難な場合があります。この問題に対処するには、C 配列を Go スライスに変換する戦略の採用を検討してください。このアプローチを示す例を次に示します。

import (
    "fmt"
    "unsafe"

    "github.com/go-cgo/cgo"
)

func main() {
    // You can adjust the `arraySize` constant to reflect the actual number of strings in your C array.
    const arraySize = 3

    // Construct a Go slice from a pointer to the C array. The `&C.myStringArray` expression returns a pointer to the first element in the C array.
    cStrings := (*[1 << 30]*cgo.Char)(unsafe.Pointer(&C.myStringArray))[:arraySize:arraySize]

    // Iterate over the Go slice and print each string.
    for _, cString := range cStrings {
        fmt.Println(cgo.GoString(cString))
    }
}

このアプローチは、型キャストを使用して C 配列を Go スライスに変換することに依存しています。 unsafe.Pointer(&C.myStringArray) 式は、C 配列の最初の要素へのポインタを返し、それが Go スライスへのポインタにキャストされます。

C 配列へのポインタをスライスすることで、 C 配列の基礎となる要素を参照する Go スライスを作成します。このスライスは反復処理でき、cgo.GoString 関数を使用して各要素を Go 文字列に変換できます。

このメソッドを使用すると、Go コードで const char* の C 配列にアクセスして操作できます。これにより、異なるプラットフォーム間で同じロギング インデックス ファイルを再利用できるようになります。

以上がcgo を使用して Go で `const char*` の C 配列にアクセスする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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