如何在Go中包装C指针而不触发“cgo result has Go pointer”

时间:2017-02-14 07:25:37

标签: python c pointers go

我正在尝试在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中有没有办法做到这一点?

0 个答案:

没有答案