Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah saya boleh menghantar penunjuk fungsi kepada kod C dalam Go 1.6 memandangkan sekatan baharu?

Bagaimanakah saya boleh menghantar penunjuk fungsi kepada kod C dalam Go 1.6 memandangkan sekatan baharu?

Linda Hamilton
Linda Hamiltonasal
2024-11-02 15:43:02340semak imbas

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

Melalukan Penunjuk Fungsi ke Kod C Menggunakan cgo: Menangani Perubahan Masa Jalan dalam Go 1.6

Pengenalan

Go 1.6 memperkenalkan pengubahsuaian kepada peraturan untuk menghantar penunjuk kepada kod C melalui cgo. Akibatnya, kaedah yang berdaya maju sebelum ini untuk memanggil panggilan balik Go dinamik daripada kod C tidak lagi berfungsi. Artikel ini meneroka garis panduan yang dikemas kini dan menunjukkan cara menghantar penunjuk fungsi kepada kod C dengan berkesan dalam ekosistem Go semasa.

Meluluskan Penunjuk Fungsi dalam Go 1.6

Bermula dari Go 1.6, peraturan berikut terpakai:

Kod Go boleh menghantar penuding Go ke C dengan syarat memori Go yang dihalakannya tidak mengandungi sebarang penunjuk Go.

Sekatan ini berpunca daripada semakan masa jalan yang memantau pelanggaran dan mencetuskan ranap apabila dikesan. Menetapkan pembolehubah persekitaran GODEBUG=cgocheck=0 melumpuhkan semakan ini buat sementara waktu, tetapi penyingkirannya dalam versi Go masa hadapan adalah mungkin.

Akibat dan Penyelesaian

Peraturan baharu melarang lulus penunjuk kepada kod C jika memori yang ditunjuk-kepada memegang penunjuk fungsi/kaedah Go. Beberapa pendekatan wujud untuk memintas pengehadan ini:

Penyegerakan dan Surat-menyurat ID

Satu strategi melibatkan mengekalkan struktur data disegerakkan yang memetakan ID kepada penunjuk sebenar. Dengan menghantar ID kepada kod C dan bukannya penunjuk langsung, anda boleh memintas sekatan sambil masih mencapai kefungsian yang diingini.

Kod Contoh

Coretan kod berikut menggambarkan cara untuk laksanakan pendekatan ini:

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

Kod ini mentakrifkan sistem pendaftaran yang memperuntukkan ID unik kepada fungsi Go dan menyimpan pemetaan dalam cara selamat benang. Apabila memanggil kod C, anda boleh menghantar ID dan bukannya penuding fungsi secara terus.

Kesimpulan

Perubahan dalam Go 1.6 memerlukan pertimbangan yang teliti apabila menghantar penunjuk fungsi kepada C kod. Dengan menggunakan teknik penyegerakan seperti yang dibentangkan di atas, anda boleh mengatasi sekatan baharu dengan berkesan dan memastikan keserasian dengan versi terkini Go.

Atas ialah kandungan terperinci Bagaimanakah saya boleh menghantar penunjuk fungsi kepada kod C dalam Go 1.6 memandangkan sekatan baharu?. 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