使用 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 正确初始化和使用这些空结构的正确方法是什么?
最佳答案
Go 的严格类型使得 typedefs 难以使用。让你的 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))
关于go - 在 CGO 中正确使用空结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23081990/