使用CGO正确使用空结构

use*_*176 4 go cgo

使用gssapi.h

struct gss_name_struct;
typedef struct gss_name_struct * gss_name_t;
Run Code Online (Sandbox Code Playgroud)

我试图弄清楚如何正确初始化包含此的变量

var output_name C.gss_name_t = &C.struct_gss_name_struct{}
Run Code Online (Sandbox Code Playgroud)

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

Jim*_*imB 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))
Run Code Online (Sandbox Code Playgroud)