在你的代码里
restype
应为
_ndtpr
类型,请参见:
lib.Function.restype = ndpointer(dtype = c_double, shape = (N,))
在numpy文档中也可以看到:
def ndpointer(dtype=none,ndim=none,shape=none,flags=none)
[其他文本]
退换商品
klass:ndpointer类型对象
类型对象,它是
NNTPR
包含的实例
数据类型、NDIM、形状和标志信息。
[其他文本]
以这种方式
lib.Function.restype
是指针类型,在golang中适当的类型必须是
unsafe.Pointer
.
但是,您想要一个需要作为指针传递的切片:
func Function(s0, s1, s2 float64, N int) unsafe.Pointer {
result := make([]float64, N)
for i := 0; i < N; i++ {
result[i] = (s0 + s1 + s2)
}
return unsafe.Pointer(&result)//<-- pointer of result
}
这会导致
在go和c之间传递指针的规则
.
-
C代码不能在调用返回后保留Go指针的副本。
资料来源:
https://github.com/golang/proposal/blob/master/design/12416-cgo-pointers.md
所以你必须转换
不安全。指针
到
uintptr
Golang类型。
func Function(s0, s1, s2 float64, N int) uintptr {
result := make([]float64, N)
for i := 0; i < N; i++ {
result[i] = (s0 + s1 + s2)
}
return uintptr(unsafe.Pointer(&result[0]))//<-- note: result[0]
}
这样你就可以工作了!
注:
C中切片的结构表示为
typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;
,但C只期望数据,因为这只需要结果
void *data
(第一个字段或字段[0])。
PoC:
https://github.com/ag-studies/stackoverflow-pointers-ref-in-golang