ワテのブログ

The fundamental things apply As time goes by.

2014年10月25日土曜日

[golang/cgo] C配列をGoの関数に渡す方法

スポンサーリンク

Cの配列をGoの関数に渡す方法。

  1. C配列のポインタと長さを渡す
  2. Go側でC配列をSliceにみせかける

メリットとしてはオーバーヘッドがほぼないこと。

デメリットとしてはreflect.SliceHeaderの構造は将来のバージョンで変更される可能性があるのでポータビリティの点で不安がある。

ちなみに、配列のメモリはC側でアロケートされているので、Go側ではメモリ管理はされない。

// c
int a[] = {0, 1, 2, 3};
hoge(&a[0], 4);
// go
func hoge(p *C.int, l C.int) {
  var go_array []C.int
  slice := (*reflect.SliceHeader)(unsafe.Pointer(&go_array))
  slice.Cap = int(l)
  slice.Len = int(l)
  slice.Data = uintptr(unsafe.Pointer(p))
  fmt.Println(go_array)
}

関連項目

スポンサーリンク

0 件のコメント:

コメントを投稿