使用CGO正确使用空结构

时间:2014-04-15 11:11:26

标签: go cgo

使用gssapi.h

struct gss_name_struct;
typedef struct gss_name_struct * gss_name_t;

我试图找出如何通过

正确初始化包含此变量的变量
var output_name C.gss_name_t = &C.struct_gss_name_struct{}

但像gss_import_name这样的函数就像是在向它们传递空指针一样。使用CGO正确初始化和使用这些空结构的正确方法是什么?

1 个答案:

答案 0 :(得分:5)

Go严格的输入使得typedef很难处理。让Go看起来清晰的最好方法是在C中编写一个小包装函数,以便按照您想要的方式构建结构。在这种情况下,go使用零长度字节数组表示空C结构,您可以在下面进行验证。您可以直接在go中声明它,并在必要时进行转换。

由于C不是类型的严格,因此使用类型推断通常是分配Go期望类型的最简单方法。还有一个技巧是使用cgo工具来显示您需要的类型声明。使用go tool cgo -godefs filename.go将输出您的类型的cgo定义。如你所见,go等效类型可能会有点混乱。

// statement in the original .go file
//var output_name C.gss_name_t = &C.struct_gss_name_struct{}

// output from cgo -godefs
// var output_name *[0]byte = &[0]byte{}

// or more succinctly
output_name := &[0]byte{}

// output_name can be converted directly to a C.gss_name_t
fmt.Printf("%+v\n", output_name)
fmt.Printf("%+v\n", C.gss_name_t(output_name))