我正在尝试在cgo中实现一个函数,它在double
中包含Slice
数组:
//export ArrayToSlice
func ArrayToSlice(a *C.double, length int) (*[]float64) {
hdr := reflect.SliceHeader{
Data: uintptr(unsafe.Pointer(a)),
Len: length,
Cap: length,
}
return (*[]float64)(unsafe.Pointer(&hdr))
}
这个函数应该是called from C, return the Slice to C, which will then pass it to another Go function。
这曾经与Go 1.5一起使用,但是1.6开始显示出这种恐慌:
panic: runtime error: cgo result has Go pointer
我明白问题是什么:Go不想发布指向C的指针,因为Go是垃圾收集的,可能会破坏非垃圾收集C代码手中的指针。
在Go 1.6中有没有办法做到这一点?