4

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

4

1 回答 1

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))
于 2014-04-15T14:00:56.237 回答