我正在为一个私人项目编写gobinding
有一个这样的typedef struct。
typedef struct {
skynet_risk_t risk;
.....
const void *unknown[13];
} skynet_result_t;当我尝试将此结构传递到函数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)。
发布于 2020-05-31 09:18:41
编译器总是说
./skynet.go:266:14: cannot use _cgo2 (type *_Ctype_char) as type unsafe.Pointer in argument to _Cfunc_skynet_classify该行为error……我从来没想过这个。
原始函数定义如下。
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])一样传输,包装器工作得很好。
https://stackoverflow.com/questions/62096566
复制相似问题