簡介
Go 1.6 引入了修改透過cgo 將指標傳遞給C 程式碼的規則。因此,先前從 C 程式碼呼叫動態 Go 回呼的可行方法不再有效。本文探討了更新後的指南,並示範如何在目前 Go 生態系統中有效地將函數指標傳遞給 C 程式碼。Go 1.6 傳遞函數指標
從Go 開始1.6,下列規則適用:Go 程式碼可以將Go 指標傳遞給C,只要它指向的Go 記憶體不包含任何Go 指標。 此限制源自於運行時檢查監控違規行為並在偵測到時引發崩潰。設定環境變數 GODEBUG=cgocheck=0 會暫時停用這些檢查,但在未來的 Go 版本中可以刪除。後果和解決方案
新規則禁止透過如果指向的記憶體保存 Go 函數/方法指針,則指向 C 程式碼的指針。有幾種方法可以規避此限制:同步和 ID 對應
一種策略涉及維護將 ID 映射到實際指針的同步資料結構。透過將 ID 傳遞給 C 程式碼而不是直接指針,您可以繞過限制,同時仍實現所需的功能。範例程式碼
以下程式碼片段說明如何實現這種方法:<code class="go">import ( "fmt" "sync" ) var mu sync.Mutex var index int var fns = make(map[int]func(C.int)) func register(fn func(C.int)) int { mu.Lock() defer mu.Unlock() index++ for fns[index] != nil { index++ } fns[index] = fn return index } func lookup(i int) func(C.int) { mu.Lock() defer mu.Unlock() return fns[i] }</code>此程式碼定義了一個登錄系統,該程式碼定義了一個登錄系統,該程式碼系統為Go 函數指派唯一的ID,並以執行緒安全的方式儲存映射。當呼叫 C 程式碼時,可以直接傳遞 ID,而不是直接傳遞函數指標。
結論
Go 1.6 中的變化,在向 C 傳遞函數指標時需要仔細考慮程式碼。透過採用上述同步技術,您可以有效克服新的限制並確保與最新版本的 Go 的兼容性。以上是考慮到新的限制,如何在 Go 1.6 中將函數指標傳遞給 C 程式碼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!