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言語ネイティブ実装が成功します。ポインターの使用時は、安全な運用を確実に守ってください。