【问题标题】:cgo C struct field access from Go: underscore or no underscore?从 Go 访问 cgo C struct 字段:下划线还是没有下划线?
【发布时间】:2015-09-18 18:15:24
【问题描述】:

在线文档与我在程序中访问 GO 代码中的 C 结构时看到的行为之间存在脱节。 go version 说我正在使用:

go version go1.4.2 linux/amd64

根据GO CGO documentation

在 Go 文件中,作为 Go 关键字的 C 的 struct 字段名称可以是 通过在它们前面加上下划线来访问:如果 x 指向一个 C 结构 一个名为“type”的字段,x._type 访问该字段。不能的 C 结构字段 在 Go 中表示的,例如位域或未对齐的数据,在 Go struct,替换为适当的填充以到达下一个字段或末尾 结构。

我遇到了麻烦,所以制作了一个快速示例程序来测试它:

package main
// struct rec
// {
//      int    i;
//      double d;
//      char*  s;
// };
import "C"
import "fmt"
func main() {
        s := "hello world"
        r := C.struct_rec{}
        r.i = 9
        r.d = 9.876
        r.s = C.CString(s)
        fmt.Printf("\n\tr.i: %d\n\tr.d: %f\n\tr.s: %s\n", 
                r.i, 
                r.d, 
                C.GoString(r.s))
}

当我按照文档指示使用下划线时(例如,将 r._i 替换为上面的 r.i)我收到以下编译错误:

r._i undefined (type C.struct_rec has no field or method _i)

当我不使用下划线时,它可以正常工作。我用指针和非指针都试过了。我唯一能想到的另一个想法是,也许是因为我在 GO 而不是 C 中分配了实例,是这样吗??

感谢您的帮助!

【问题讨论】:

  • i 不是关键字,因此您不需要 _

标签: struct go cgo


【解决方案1】:

答案就在您的问题中的引用中:

在 Go 文件中,C 的结构字段名称在 Go 中为 keywords 可以通过在它们前面加上下划线(...)来访问

ids 不是 Go 中的关键字。

【讨论】:

    猜你喜欢
    • 2022-12-26
    • 2018-04-29
    • 2017-05-13
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 2013-08-22
    相关资源
    最近更新 更多