Mengakses C Char Array dalam Go dengan cgo
Dalam C, kita sering menghadapi tatasusunan penunjuk aksara tetap (cth. const char *myStringArray []). Mengakses tatasusunan sedemikian daripada Go menggunakan cgo boleh terbukti mencabar.
Pendekatan Salah:
Pada mulanya, anda boleh cuba mengindeks tatasusunan secara terus menggunakan aritmetik penunjuk yang tidak selamat:
myGoString := C.GoString((*C.char) (unsafe.Pointer(uintptr(unsafe.Pointer(C.myStringArray)) + uintptr(index) * unsafe.Sizeof(C.myStringArray))))
Walau bagaimanapun, pendekatan ini akan menavigasi melalui aksara dalam rentetan, bukan tatasusunan itu sendiri.
Penyelesaian Betul:
Penyelesaian yang lebih dipercayai melibatkan penukaran tatasusunan C menjadi kepingan Go.
// Define array size arraySize := 3 // Create Go slice cStrings := (*[1 << 30]*C.char)(unsafe.Pointer(&C.myStringArray))[:arraySize:arraySize] // Iterate over slice for _, cString := range cStrings { fmt.Println(C.GoString(cString)) }
Pendekatan ini memastikan pengindeksan tatasusunan yang betul, menyediakan akses kepada setiap elemen rentetan secara keseluruhannya.
Dengan memahami selok-belok manipulasi penunjuk dan utiliti hirisan Go, anda boleh merapatkan jurang antara struktur memori C dan Go dengan berkesan.
Atas ialah kandungan terperinci Bagaimana untuk Selamat Mengakses Array C Char dalam Go menggunakan cgo?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!