在CGO中正确使用空结构

在CGO中正确使用空结构,go,cgo,Go,Cgo,合作 我试图找出如何通过 var output_name C.gss_name_t = &C.struct_gss_name_struct{} 但是像这样的函数的行为就像我向它们传递空指针一样。正确初始化这些空结构并将其与CGO一起使用的正确方法是什么?Go的严格键入让TypeDef很难使用。让Go看起来清晰的最好方法是用C编写一个小的包装函数,以按照您想要的方式构建结构。不过,在本例中,go对空C结构使用零长度字节数组,您可以在下面进行验证。您可以直接在go中声明它,并在必要时转换它

合作

我试图找出如何通过

var output_name C.gss_name_t = &C.struct_gss_name_struct{}

但是像这样的函数的行为就像我向它们传递空指针一样。正确初始化这些空结构并将其与CGO一起使用的正确方法是什么?

Go的严格键入让TypeDef很难使用。让Go看起来清晰的最好方法是用C编写一个小的包装函数,以按照您想要的方式构建结构。不过,在本例中,go对空C结构使用零长度字节数组,您可以在下面进行验证。您可以直接在go中声明它,并在必要时转换它

由于C对类型不严格,因此使用类型推断通常是分配Go期望的类型的最简单方法。还有一个使用cgo工具显示所需类型声明的技巧。使用
go工具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))

这确实有效。不过需要注意的是,打印[0]字节的效率不高(实际上不会打印任何内容)。没问题,gssapi有用于提取字符串表示的C函数。我只是想提一下,这样就不会让其他人感到困惑了。
// 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))