[英]How to transfer a complex C struct to C from Go
我正在為一個私人項目編寫 gobinding
有一個像這樣的typedef struct
。
typedef struct {
skynet_risk_t risk;
.....
const void *unknown[13];
} skynet_result_t;
當我嘗試將此結構傳遞給 func skynet_status_t skynet_classify(......, skynet_result_t *result);
我這樣寫
result := C.skynet_result_t{}
status = C.skynet_classify(
...
&result,
)
我得到這個cannot use _cgo2 (type *_Ctype_char) as type unsafe.Pointer in argument to _Cfunc_skynet_classify
但是當我寫這樣的函數時
void print_skynet_result(skynet_result_t *result){
// do nothing
}
我以同樣的方式稱呼它。
result := C.skynet_result_t{}
C.print_skynet_result(&result)
編譯通過,一切正常。 我遇到了什么麻煩
我不知道為什么 cgo 說它是(type *_Ctype_char)
編譯器總是說
./skynet.go:266:14: cannot use _cgo2 (type *_Ctype_char) as type unsafe.Pointer in argument to _Cfunc_skynet_classify
線路是錯誤的……我從來沒有想過這個。
原點函數是這樣定義的。
skynet_status_t skynet_classify(skynet_request_t *req,
skynet_classify_type_t type,
const void *data,
size_t length,
skynet_result_t *result);
我定義了一個像這樣的包裝器。
func (s *skynetRequest) Classify(t uint32, data []byte) (*skynetResult, error) {
var result skynetResult
// var temp = C.pass_skynet_result_t((*C.skynet_result_t)(&result))
var status = C.skynet_classify(
(*C.skynet_request_t)(s),
(C.uint)(t),
unsafe.Pointer(&data[0]),
C.ulong(len(data)),
(*C.skynet_result_t)(&result),
)
if status != 0 {
return &result, errors.New("classify error")
}
return &result, nil
}
@user2089648 提醒我,這可能不是 result 參數引起的,但可能是其他參數引起的,然后我發現const void *data
應該像這樣傳輸unsafe.Pointer(&data[0])
,wrapper 效果很好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.