Golangでポインタを使ってCの配列からデータにアクセスする方法

Go言語では、unsafe.Pointer型を使用してC言語の配列データへアクセスできます。

C言語の次のコードを想定します。

#include <stdio.h>
void print_array(int *arr, int length) {
for (int i = 0; i < length; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}

私たちはGo言語でprint_array関数を呼び出して、配列の先頭アドレスを渡したいと考えています。

まず、Goコード内にunsafeパッケージをインポートする必要があります。

import "unsafe"

次に、Cの配列ポインタ型の変数を定義することができます。

var arr *C.int

次に、C.CString 関数を使って、Go 言語の配列を C 言語の配列に変換できます:

length := C.int(len(myArray))
arr = (*C.int)(unsafe.Pointer(&myArray[0]))

&myArray[0] は配列の最初の要素のアドレスで、 unsafe.Pointer を用いて *C.int 型のポインタに変換する

最後に、C関数を呼び出してポインタパラメータを渡せます。

C.print_array(arr, length)

ネイティブのサンプルコードを以下に示します。

package main
/*
#include <stdio.h>
void print_array(int *arr, int length) {
for (int i = 0; i < length; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
*/
import "C"
import "unsafe"
func main() {
myArray := []int{1, 2, 3, 4, 5}
length := C.int(len(myArray))
arr := (*C.int)(unsafe.Pointer(&myArray[0]))
C.print_array(arr, length)
}

上記コードを実行すると、次の出力が表示されます。

1 2 3 4 5

unsafeパッケージを使用する場合は非常に注意する必要がありますが、これでCの配列データのポインターを通してデータにアクセスするためのGo言語ネイティブ実装が成功します。ポインターの使用時は、安全な運用を確実に守ってください。

bannerAds