Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah saya boleh menghantar penunjuk fungsi kepada kod C dalam Go menggunakan cgo selepas perubahan dalam Go v1.6?

Bagaimanakah saya boleh menghantar penunjuk fungsi kepada kod C dalam Go menggunakan cgo selepas perubahan dalam Go v1.6?

Susan Sarandon
Susan Sarandonasal
2024-11-03 22:13:31666semak imbas

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

Melalukan Penunjuk Fungsi kepada Kod C dengan cgo

Bermula dengan Go v1.6, cgo mengubah peraturan untuk menghantar penunjuk kepada kod C. Kaedah terdahulu untuk menggunakan panggilan balik Go dinamik daripada kod C, seperti yang digariskan dalam wiki Go, tidak lagi berfungsi.

Peraturan Baharu cgo

cgo kini melarang menghantar penunjuk Go kepada C jika ingatan yang mereka rujuk mengandungi sebarang penunjuk Go itu sendiri. Sekatan ini dikuatkuasakan pada masa jalanan, mengakibatkan ranap program jika dilanggar.

Mengatasi Had

Walaupun pengehadan baharu, terdapat beberapa cara untuk memindahkan penunjuk kepada kod C sambil mematuhi peraturan yang ditetapkan. Satu pendekatan biasa melibatkan penyimpanan struktur data disegerakkan yang memetakan antara ID unik dan penunjuk sebenar. Ini membolehkan pemindahan ID kepada kod C dan bukannya penunjuk langsung.

Penyelesaian Kod

Coretan kod berikut menunjukkan penyelesaian kepada isu tersebut:

<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>

Kod ini sejajar dengan garis panduan halaman wiki yang dikemas kini dan menyediakan penyelesaian yang boleh dilaksanakan untuk menghantar penunjuk fungsi kepada kod C di bawah peraturan cgo baharu.

Atas ialah kandungan terperinci Bagaimanakah saya boleh menghantar penunjuk fungsi kepada kod C dalam Go menggunakan cgo selepas perubahan dalam Go v1.6?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn