Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Menghantar Go Slice ke Fungsi C yang Menjangkakan Penunjuk kepada Tatasusunan Rentetan C?
Melalukan Penunjuk kepada Slice ke Fungsi C dalam Go
Dalam Go, tugas biasa apabila berinteraksi dengan fungsi C adalah melepasi kompleks struktur data seperti kepingan. Walau bagaimanapun, kepingan Go dan tatasusunan C mempunyai perbezaan asas yang memerlukan pengendalian khas.
Pertimbangkan fungsi C berikut dengan tandatangan int f(int *count, char ***strs). Ia memerlukan dua penuding: kira mata kepada panjang tatasusunan rentetan dan strs menunjuk kepada tatasusunan penuding rentetan.
Dalam Go, kita tidak boleh meneruskan hirisan kepada fungsi sedemikian kerana hirisan adalah struktur data khusus Go dan berbeza daripada tatasusunan C. Selain itu, kepingan Go mengandungi penuding Go, yang cgo melarang menghantar ke fungsi C.
Untuk mengatasinya, kita perlu memperuntukkan tatasusunan dalam C secara manual dan menjejaki tempat mengosongkan tatasusunan luar . Untuk setiap rentetan dalam kepingan Go, kami menukarnya kepada rentetan C menggunakan C.CString dan merekodkan penuding rentetan C yang sepadan dalam tatasusunan C yang diperuntukkan.
Berikut ialah versi kod Go yang diubah suai:
cArray := C.malloc(C.size_t(c_count) * C.size_t(unsafe.Sizeof(uintptr(0)))) // Convert the C array to a Go Array for easy indexing a := (*[1<<30 - 1]*C.char)(cArray) for index, value := range strs { a[index] = C.CString(value) } err := C.f(&c_count, (***C.char)(unsafe.Pointer(&cArray)))
Pendekatan ini memastikan bahawa fungsi C mempunyai akses kepada yang boleh dimanipulasi Tatasusunan C, sambil membenarkan kami menukar tatasusunan yang dimanipulasi kembali menjadi kepingan Go untuk kegunaan selanjutnya.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghantar Go Slice ke Fungsi C yang Menjangkakan Penunjuk kepada Tatasusunan Rentetan C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!