Доступ к массиву C типа const char * из Go
У меня есть файл C с массивом типа const char *
Давайте назовем это myStringArray[]
, что-то вроде:
const char *myStringArray[] = {
"NAME_OF_FIRST_THING",
"NAME_OF_SECOND_THING",
"NAME_OF_THIRD_THING"}
Мне нужно Go, чтобы индексировать в этот массив C, используя cgo
и преобразовать запись массива в строку Go. Следующий код компилируется, но не работает правильно; вы можете видеть из вывода, который следует, что он индексирует по строкам, а не по массиву:
myGoString := C.GoString((*C.char) (unsafe.Pointer(uintptr(unsafe.Pointer(C.myStringArray)) + uintptr(index) * unsafe.Sizeof(C.myStringArray))))
... результат таков:
NAME_OF_FIRST_THING
FIRST_THING
ING
К вашему сведению, цель этого состоит в том, чтобы декодировать на сервере файл журнала, который был создан на встроенной платформе под управлением C, следовательно, необходимо повторно использовать те же файлы индекса ведения журнала.
Я несколько часов ударил это случайно, но безуспешно. Кто-нибудь может исправить мою конструкцию или предложить альтернативу?
1 ответ
Хотя вы могли бы сделать арифметику указателей самостоятельно, безопаснее и удобнее сначала преобразовать массив C в слайс Go.
arraySize := 3
cStrings := (*[1 << 30]*C.char)(unsafe.Pointer(&C.myStringArray))[:arraySize:arraySize]
for _, cString := range cStrings {
fmt.Println(C.GoString(cString))
}
// prints:
// NAME_OF_FIRST_THING
// NAME_OF_SECOND_THING
// NAME_OF_THIRD_THING
Соответствующая запись в cgo: https://github.com/golang/go/wiki/cgo