Menukar C char Array kepada Go byte Array
Apabila bekerja dengan C dan Go, kadangkala perlu menukar antara dua bahasa' jenis tatasusunan. Soalan ini meneroka penukaran tatasusunan C jenis [1024]C.char kepada jenis tatasusunan Go [1024]bait.
Tidak Dapat Menukar Secara Terus
Percubaan untuk melakukan penukaran antara muka mengakibatkan ralat:
cannot convert (*_Cvar_my_buf) (type [1024]C.char) to type [1024]byte
Ini kerana kedua-dua jenis tatasusunan pada asasnya berbeza dalam perwakilan memori.
Penyelesaian: Salin ke Hiris
Satu kaedah yang selamat dan mudah untuk menukar tatasusunan C ialah menyalin kandungannya ke kepingan Go. Ini boleh dicapai menggunakan kod berikut:
mySlice := C.GoBytes(unsafe.Pointer(&C.my_buff), C.BUFF_SIZE)
Di sini, C.GoBytes menukar tatasusunan C kepada kepingan Go bait, yang boleh diberikan kepada pembolehubah mySlice.
Penukaran Tidak Selamat
Jika akses memori terus diperlukan, adalah mungkin untuk "menghantar" C tatasusunan kepada tatasusunan Go byte menggunakan unsafe.Pointer. Walau bagaimanapun, ini adalah operasi yang tidak selamat yang harus digunakan dengan berhati-hati:
mySlice := unsafe.Slice((*byte)(unsafe.Pointer(&C.my_buf)), C.BUFF_SIZE)
Ini membuang tatasusunan C sebagai kepingan bait. Jika jenis tatasusunan diperlukan, kepingan boleh ditukar:
myArray := ([C.BUFF_SIZE]byte)(mySlice)
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menukar Tatasusunan C `[1024]C.char` kepada Tatasusunan `[1024]bait` Go dengan Selamat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!