使用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正确初始化和使用这些空结构的正确方法是什么?
答案 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))