1. 程式人生 > >cgo傳遞golang slice, 以及使用二級指標獲取值

cgo傳遞golang slice, 以及使用二級指標獲取值

背景:
在golang中呼叫c函式時,會通過slice傳遞一組數;以及想通過二級指標引用獲取c中的變數值,這樣就不用再c中單獨定義變數,有可能還有手動釋放變數。

示例

package main
/*
#include <stdio.h>
int loop(int** list_data, int leng, char** data)
{
  int* m = (int*)list_data;
  int sum = 0;
  for(int i=0; i<leng; i++)
  {
    sum += m[i];
  }
  *data = "finised task";
  return sum;
}
*/
import "C"
import (
 "unsafe"
 "fmt"
)
func main () {
   var ids []int32 = []int32{1,2,3,5}
   var res *C.char
   leng := C.int(len(ids))
   le := C.loop((**C.int)(unsafe.Pointer(&ids[0])),leng ,&res)
   fmt.Println(le)
   fmt.Println(C.GoString(res))
   fmt.Println(ids)
}

說明:
以上示例中,ids中的資料型別為int32,主要是為了跟c中int資料型別保持一致(資料型別長度)。
1、 slice 的資料結構包括兩部分,頭部,資料。頭部資訊包括slice的長度,容量,指向陣列的指正。陣列主要是儲存資料。 unsafe.Pointer(&ids[0])獲取資料第一個資料的地址,並返回一個通用的指標型別。(**C.int)(unsafe.Pointer(&ids[0])) 將通用指正型別轉換為 cgo的int型別,對應的就是c的int型別。
2、 &res 是獲取char的二級指標。