ホームページ  >  記事  >  バックエンド開発  >  Go v1.6 での変更後、cgo を使用して Go で関数ポインターを C コードに渡すにはどうすればよいですか?

Go v1.6 での変更後、cgo を使用して Go で関数ポインターを C コードに渡すにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-03 22:13:31662ブラウズ

How can I pass function pointers to C code in Go using cgo after the changes in Go v1.6?

cgo を使用して関数ポインターを C コードに渡す

Go v1.6 以降、cgo は C コードにポインターを渡すためのルールを変更しました。 Go wiki で概説されているように、C コードから動的 Go コールバックを呼び出す以前の方法は機能しなくなりました。

cgo の新しいルール

cgo は Go ポインターを渡すことを禁止するようになりました。参照するメモリに Go ポインタ自体が含まれている場合は C に戻ります。この制限は実行時に適用され、違反するとプログラムがクラッシュします。

制限の克服

新しい制限にもかかわらず、ポインタを C コードに転送する方法はいくつかあります。課せられたルールを守りながら。一般的なアプローチの 1 つは、一意の ID と実際のポインターの間でマッピングする同期されたデータ構造を保存することです。これにより、直接ポインタの代わりに ID を C コードに転送できるようになります。

コード ソリューション

次のコード スニペットは、この問題の解決策を示しています。

<code class="go">package main

import (
    "fmt"
    "sync"
)

// Declare a function to be invoked by C code.
func MyCallback(x int) {
    fmt.Println("callback with", x)
}

func Example() {
    i := register(MyCallback) // Register the callback function and obtain its ID.
    C.CallMyFunction(C.int(i)) // Pass the ID to the C function.
    unregister(i) // Deregister the callback function.
}

// Data structures for registering and deregistering callbacks.
var mu sync.Mutex
var index int
var fns = make(map[int]func(int))

// Register a callback function and return its ID.
func register(fn func(int)) int {
    mu.Lock()
    defer mu.Unlock()
    index++
    for fns[index] != nil {
        index++
    }
    fns[index] = fn
    return index
}

// Return the callback function associated with a given ID.
func lookup(i int) func(int) {
    mu.Lock()
    defer mu.Unlock()
    return fns[i]
}

// Deregister a callback function using its ID.
func unregister(i int) {
    mu.Lock()
    defer mu.Unlock()
    delete(fns, i)
}

func main() {
    Example()
}</code>

このコードは wiki ページの更新されたガイドラインに準拠しており、新しい cgo ルールに基づいて関数ポインターを C コードに渡すための実行可能なソリューションを提供します。

以上がGo v1.6 での変更後、cgo を使用して Go で関数ポインターを C コードに渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。