来自Go的cgo C struct字段访问:下划线还是没有下划线?

时间:2015-07-01 14:15:18

标签: struct go cgo

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

go version go1.4.2 linux/amd64

根据GO CGO documentation

  

在Go文件中,作为Go中关键字的C结构字段名称可以是   通过在前缀下加下划线来访问:如果x指向C结构   一个名为" type"的字段,x._type访问该字段。 C结构字段不能   在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中分配了实例,是这样吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

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

  

在Go文件中,可以通过在下面添加下划线(...)

来访问C的结构字段名称,它们是Go 中的keywords

ids不是Go中的关键字。