簡體   English   中英

如何將復雜的 C 結構從 Go 轉移到 C

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM