【问题标题】:Access C array of type const char * from Go从 Go 访问 const char * 类型的 C 数组
【发布时间】:2018-05-01 11:13:09
【问题描述】:

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

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

我需要 Go 使用 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 的嵌入式平台上创建的日志文件,因此需要重用相同的日志索引文件。

我已经随机刺了几个小时,但没有成功。谁能纠正我的结构,或提供替代方案?

【问题讨论】:

    标签: c string pointers go cgo


    【解决方案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

    【讨论】:

    • 耶!而已。我确实阅读了该条目,但也无法遵循那里的语法,因此我选择了我认为可以应付的指针。我的错 :-)。非常感谢您的快速答复。
    猜你喜欢
    • 2015-09-14
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    相关资源
    最近更新 更多