当前位置: 首页 > 面试题库 >

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

祁通
2023-03-14
问题内容

我有一个类型为C的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



 类似资料:
  • 问题内容: 我正在尝试从Objective-C 访问Swift类的属性。 在另一个视图控制器中,我尝试按以下方式进行访问: 而我得到 在类型’BusinessDetailViewController *’的对象上找不到属性’lat’ 为什么我不能访问此属性?我想念什么? 问题答案: 非Objective-C类型的可选值不会桥接到Objective-C中。也就是说,前三个属性下面 会 是在Objec

  • 我理解您可以从派生类访问基类的成员,然而,我有一个函数需要指向我的基类作为一个整体的指针。例如: 有没有办法从派生类中获得指向这个基类的指针?

  • 问题内容: 该模块为通用类型提示提供了一个基类:该类。 方括号中的接受类型参数的子类,例如: 我的问题是,如何访问这些类型参数? 也就是说,作为输入,我如何获得和输出? 基本上我正在寻找这样的功能 问题答案: Python 3.8更新 从Python3.8开始,有: PEP-560还提供了,它允许我们使用第 n 个通用基的参数: 旧答案 可能性1 从Python 3.6开始。有一个公共和()字段。

  • 我不明白为什么我甚至不能创建一个新实例,IDE将内部类名标记为未分配 尝试过没有成功 我创建了内部类以从方法获取返回值,并在另一个类中使用它。我这样做对吗?

  • 本文向大家介绍C#使用dynamic类型访问JObject对象,包括了C#使用dynamic类型访问JObject对象的使用技巧和注意事项,需要的朋友参考一下 dynamic是C#里面的动态类型,可在未知类型的情况访问对应的属性,非常灵活和方便。 使用Json.Net可以把一个Json字符串转换成一个JObject对象,如果有已知强类型,如果有已知对应的强类型,可以直接转成对应的类型。但如果没有,

  • 问题内容: 有一个Objective c基类: 和一个快速的子类: 我如何 从内部访问? 问题答案: 很棒的查询。我们已经尽力做到这一点。我找到的唯一可行的解​​决方案 通过使用获得价值 设定值使用 希望有帮助。在不更改超级类的情况下可能的解决方案。