我有这个一个C函数。用于一个特征和多个模型之间的比对。数组
int match(void *feat, void **models, int model_num, float *score, int *index);函数
在C语言中,用void **表达指针数组是天然的方式。测试
Go语言中开始这么写,ui
func (s *Lib) Predict(feat []byte, model []byte) (float32, error) {
cFeat := unsafe.Pointer(&feat[0])
cModelNum := C.int(1)
cModels := make([]unsafe.Pointer, cModelNum)
var cScore C.float
var cIndex C.int
cModels[0] = unsafe.Pointer(&model[0])
ret := C.ul_vpr_match(cFeat,
(*unsafe.Pointer)(unsafe.Pointer(&cModels[0])),
cModelNum,
&cScore,
&cIndex)
return float32(cScore), asError(ret, "match")
}spa
测试问题:指针
panic: runtime error: cgo argument has Go pointer to Go pointer [recovered]model
改为下面方式,能够。float
func (s *VprLib) Predict(feat []byte, model []byte) (float32, error) {
cFeat := unsafe.Pointer(&feat[0])
cModelNum := C.int(1)
cModels := make([]uintptr, cModelNum)
var cScore C.float
var cIndex C.int
cModels[0] = uintptr(unsafe.Pointer(&model[0]))
ret := C.ul_vpr_match(cFeat,
(*unsafe.Pointer)(unsafe.Pointer(&cModels[0])),
cModelNum,
&cScore,
&cIndex)
return float32(cScore), nil
}im