Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Selamat Mengakses Array C Char dalam Go menggunakan cgo?

Bagaimana untuk Selamat Mengakses Array C Char dalam Go menggunakan cgo?

Linda Hamilton
Linda Hamiltonasal
2024-11-18 07:12:02736semak imbas

How to Safely Access a C Char Array in Go using cgo?

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!

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