从Go访问类型为const char *的C数组

时间:2017-11-17 16:01:14

标签: c string pointers go cgo

我有一个类型为const char *的数组的C文件,我们称之为myStringArray[],类似于:

const char *myStringArray[] = {
  "NAME_OF_FIRST_THING",
  "NAME_OF_SECOND_THING",
  "NAME_OF_THIRD_THING"}

我需要使用cgo转到该C数组的索引,并将数组条目转换为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 个答案:

答案 0 :(得分: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 wiki条目:https://github.com/golang/go/wiki/cgo#turning-c-arrays-into-go-slices