最后有個項目需要涉及到cgo,在這塊以前用的不多,
這次略微用得深入了一點,記下來幾點以備以后使用
本質上cgo去用的時候就是遵守一些ABI而已,總體而言,盡量避免復雜結構的來回傳遞。1 對于變長參數,只有寫一個個c的方法,比如static方法wrap一下成非變長的,當然這樣羅嗦但是沒辦法 2 對于enum,可直接使用,c語言的void*對應著unsafe.Pointer3 比較復雜的是對于需要傳一個函數指針/回調函數的,只有走曲線救國的路線,即傳一個c寫的wrap->調用go export的的方法(其實就是通過//export導出加_cgo_export.h即可讓c使 用),排查問題的時候可通過-work保留中間生成的.h文件。當然在這之上略微進階一點是玩個trampoline,其實注是加了個中間層,這樣可以支持go的閉包。 4 庫的加載自己采用pkg-config(macos/linux上都可以,windows不可以),即macos上開發,docker(linux)跑。
后話:
? ? ? ?為了玩這個,我找了個開源的好好讀了一下,同時為了更深入一點,把別人的c代碼也讀了一下,同時為了更好玩,我選擇了Rust(這個也是我喜歡玩的語言之一,但是要看場景 ),Rust的FFI的話那確實是更適合做這種綁定,更別說Rust更鼓勵做static而不是share的庫,可能背后也跟golang有自己的運行時,和c其實映射上也做不到rust那樣簡單,或許這就是rust零抽象的一個具體體現吧.