go - 在 CGO 中正确使用空结构

标签 go cgo

使用 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/

相关文章:

go - new() 和 "regular"分配有区别吗?

通过使用值的 slice 作为带有 switch 语句的 case 来匹配一个值

macos - 在 OSX 10.9 上编译 C 包

go - 如何在 cgo 导出函数中获取正确的参数名称?

go - 如何在 Go 中访问 C 位域

java - 使用 cgo 从 Go 返回 String[]

go - (nil) 在这种情况下到底在做什么 []string(nil)

unit-testing - 在结构内部的方法中测试错误响应

go - 我在获取 golang.org/x/tools/cmd/goimports 时遇到问题

go - 什么是 cgo 类型,相当于指向结构的 const 指针?