我在一个项目中使用cgo,我想导出一个函数供使用.这是我想要实现的一个例子:
package csplit import ( "C" "strings" ) //export Split /* The Split function takes two C strings,the second of which represents a substring to split on,and returns an array of strings. Example: Split("1,2",",") // gives ["1","2"] */ func Split(original *C.char,split *C.char) []*C.char { goResult := strings.Split(C.GoString(original),C.GoString(split)) cResult := make([]*C.char,len(goResult)) for idx,substring := range goResult { cResult[idx] = C.CString(substring) } return cResult }
问题是返回类型是Go分配数据,而不是移入C堆.这有点恐慌:运行时错误:cgo结果有Go指针
解决方法
您将返回在Go中分配的Go切片,并且是与C数组不同的结构.你需要在C中分配一个数组:
//export Split func Split(original *C.char,split *C.char) **C.char { goResult := strings.Split(C.GoString(original),C.GoString(split)) cArray := C.malloc(C.size_t(len(goResult)) * C.size_t(unsafe.Sizeof(uintptr(0)))) // convert the C array to a Go Array so we can index it a := (*[1<<30 - 1]*C.char)(cArray) for idx,substring := range goResult { a[idx] = C.CString(substring) } return (**C.char)(cArray) }