golang 調用一個c的so庫, 函數RegisterCanc的回調函數結構如下typedef void (*CanCallBack)(int canChannel, char * canFrame, int canDataLen,unsigned long long canTime);int RegisterCan(CanCallBack event);要用go的實現CanCallBack回調函數的方法網上找到相關cgo的說明,不是很懂,還望好心人給與提示https://golang.org/cmd/cgo/#h...
2 回答

慕神8447489
TA貢獻1780條經驗 獲得超1個贊
說白了,題主需求的場景就是:
go語言側代碼調用第三方的C語言庫函數,但是庫函數要求傳入一個函數指針作為回調,然后題主想用cgo實現這個回調
golang官方關于cgo的wiki頁有詳細的關于題主詢問場景下的解決方法介紹。
主要是要做幾件事情:
用cgo實現這個回調函數的本體。比如實現一個類似下面這樣的cgo函數,并將其導出
func CanCallBack(canChannel int, canFrame C.String, canDataLen int, canTime uint64) { //...函數具體實現}
以上偽代碼是隨手寫的,主要是參數類型不知道是否合適,特別是那個char 的參數需要根據實際情況來決定在cgo中定義成什么。*
在注釋部分用C語言語法實現一個gateway function(gateway function的介紹可參見上文給出的鏈接,gateway function的簽名必須和函數指針一致)。在這個gateway function中通過上述回調函數的導出簽名來調用上述回調函數
在你想調用第三方庫函數代碼的cgo代碼中調用這個第三方函數,傳參時把上述gateway function的函數名傳入
總得來說就是以上三件事,但是具體寫代碼時還有一些細節需要注意的,我之前寫過一篇博客有提到這些注意點,感興趣的話,題主可以參考一下:
我寫的這篇博客討論的場景和題主期待的場景略有不同,望注意. 不過這里面存在的坑是共通的,比如說必須定義為main包之類的
- 2 回答
- 0 關注
- 1896 瀏覽
添加回答
舉報
0/150
提交
取消