从 Go 访问类型为 const char * 的 C 数组
Access C array of type const char * from 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 上创建的日志文件,因此需要重新使用相同的日志记录索引文件。
我已经随机刺了几个小时,但没有成功。谁能纠正我的构造,或者提供替代方案?
虽然你可以自己做指针运算,但先将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
我有一个 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 上创建的日志文件,因此需要重新使用相同的日志记录索引文件。
我已经随机刺了几个小时,但没有成功。谁能纠正我的构造,或者提供替代方案?
虽然你可以自己做指针运算,但先将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