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!