我有這個一個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