Доступ к массиву 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

Другие вопросы по тегам