使用cgo 存取Go 中的C 字元陣列
在C 中,我們經常遇到常數字元指標數組(例如const char * myStringArray [])。使用 cgo 從 Go 存取此類陣列可能具有挑戰性。
不正確的方法:
最初,您可能會嘗試使用不安全的指針算術直接索引數組:
myGoString := C.GoString((*C.char) (unsafe.Pointer(uintptr(unsafe.Pointer(C.myStringArray)) + uintptr(index) * unsafe.Sizeof(C.myStringArray))))
但是,這種方法將導航字串中的字符,而不是數組
正確解決方案:
更可靠的解決方案是將C 數組轉換為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)) }
這種方法可確保正確的解決方案陣列的索引,提供對每個字串元素的完整存取。
透過理解指標操作的複雜性和Go 切片的實用性,可以有效彌合 C 和 Go 記憶體結構之間的差距。
以上是如何使用 cgo 安全地存取 Go 中的 C 字元陣列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!