[英]How do I convert a Go array of strings to a C array of strings?
I am using cgo
in a project, and I want to export a function for use. 我在一个项目中使用
cgo
,我想导出一个函数供使用。 Here's an example of what I want to achieve: 这是我想要实现的一个例子:
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
}
The problem is that the return type is Go allocated data, and not moved into the C heap. 问题是返回类型是Go分配数据,而不是移入C堆。 This panics with:
runtime error: cgo result has Go pointer
这有点恐慌:
runtime error: cgo result has Go pointer
You're returning a Go slice which is allocated in Go, and is a different structure than a C array. 您将返回在Go中分配的Go切片,并且是与C数组不同的结构。 You need to allocate an array in 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)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.