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!