C言語の関数にsliceの中身をポインタとして渡す

  • 3
    Like
  • 0
    Comment
More than 1 year has passed since last update.
intSlice := []int{0, 1, 2, 3, 4}
some_func_requiring_intptr( (*C.int)(&intSlice[0]) )

引用元: Pass Go slices as C array parameters | coderwall

上のリンクではキャスト付いてないけど、実際に使ってみるとコンパイラに怒られたのでキャストしましょう

ポイントは

  • &slice[0]でポインタが取得できる(っぽい)
  • Goは型にうるさいのでキャストする

です

例を書いておく。cgoを使って、例えば以下のようなC言語の関数をラップすることを考える。

// 第一引数に入力の配列をとって、結果を第二引数に格納する。配列の長さは第三引数で指定する
void doSomething(double *inputBuffer, double *resultBuffer, const int sizeOfBuffer);

以下のように書く

// パッケージ名
package hoge

// #include <インクルードファイルの名前>
// LDFLAGS、pkg-config等、必要であれば書く
import "C"

func doSomethingInGo(inputBuffer []float64) []float64 {
    resultBuffer := make([]float64, len(inputBuffer))
    C.doSomething((*C.double)(&inputBuffer[0]), (*C.double)(&resultBuffer[0]), C.int(len(inputBuffer)))
    return resultBuffer
}

おわり

    resultBuffer := hoge.doSomethingInGo(inputBuffer)