首頁  >  文章  >  後端開發  >  考慮到新的限制,如何在 Go 1.6 中將函數指標傳遞給 C 程式碼?

考慮到新的限制,如何在 Go 1.6 中將函數指標傳遞給 C 程式碼?

Linda Hamilton
Linda Hamilton原創
2024-11-02 15:43:02351瀏覽

How can I pass function pointers to C code in Go 1.6  given the new restrictions?

使用cgo 將函數指標傳遞給C 程式碼:解決Go 1.6 中的執行時間變更

簡介

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn