我有一个类型为C的C文件const char *,可以这样称呼它myStringArray[],例如:
const char *
myStringArray[]
const char *myStringArray[] = { "NAME_OF_FIRST_THING", "NAME_OF_SECOND_THING", "NAME_OF_THIRD_THING"}
我需要使用Go转到该C数组的索引cgo,并将数组项转换为Go字符串。以下代码可以编译,但不能正常运行;您可以从下面的输出中看到,它是沿着字符串而不是数组进行索引:
cgo
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的嵌入式平台上创建的日志文件,因此需要重新使用相同的日志记录索引文件。
我已经随机刺了几个小时,但没有成功。谁能纠正我的结构,或提供替代方法?
尽管您可以自己进行指针算术运算,但先将C数组转换为Go slice更加安全便捷。
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