cgo中調用有函數指針參數的C函數


最近同事接一個設備的sdk,是使用的C的動態庫,需要用cgo方法。
其中有一個函數,參數需要函數指針,讀了一下cgo的官方文檔,發現不支持這種調用方式。

按照官網的方法,需要用C寫個gateway 函數,在C里再封裝一下,提供沒有函數指針參數的函數供go調用。
本來想着有空了,寫個C包裝器,后來同事找他的朋友,折騰了一天,用更加巧妙的方法解決了。

其實可以換個思路,函數指針參數,實際不就是C調用go嗎?
所以可以在go里寫個函數,導出(export)到C,這樣巧妙的繞過了cgo的限制了。
所以這個流程就變成了下面這個樣子。
go-->cgo-->c(有函數指針的C函數)-->cgo-->go(導出到C的go函數)

注意C中void函數指針,要在go中函數返回類型要定義為 unsafe.Pointer,在函數體中返回nil即可


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM