cgo傳遞golang slice, 以及使用二級指標獲取值
阿新 • • 發佈:2018-11-30
背景:
在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的二級指標。