将带有联合字段的C结构体映射到Go结构体

3
我正在使用Go语言对一些WinApi进行系统调用并获取结果。我能轻松地将C代码中的简单结构映射过来,但是如何处理下面这样的C结构呢?
typedef struct SPC_LINK_
{
    DWORD dwLinkChoice;
#               define          SPC_URL_LINK_CHOICE         1
#               define          SPC_MONIKER_LINK_CHOICE     2
#               define          SPC_FILE_LINK_CHOICE        3

    union
    {
        LPWSTR                  pwszUrl;
        SPC_SERIALIZED_OBJECT   Moniker;
        LPWSTR                  pwszFile;
    };

} SPC_LINK, *PSPC_LINK;

如果在Go语言中定义了所有可能的类型
type SPC_LINK struct {
    dwLinkChoice  DWORD
    Moniker       SPC_SERIALIZED_OBJECT
    pwszFile      LPWSTR
    pwszUrl       LPWSTR
}

在使用unsafe.Pointer作为参数进行系统调用后,我已经将其保存在内存中,并可以像往常一样在Go语言中访问它。但是,在dwLinkChoice之后的第一个字段(如上面的代码中的Moniker)总是已填充,而其他两个字段总是为空。我知道这在C语言中是预期行为,因为你一次只能有一个联合字段。考虑到这一点,我是否应该忽略整个联合结构,在我的Go结构体中使用某种占位符?

type SPC_LINK struct {
    dwLinkChoice  DWORD
    dwLink        uintptr // a placeholder, will hold any possible value
}

我将占位符的类型设置为uintptr,但是如果原始的C结构在联合块中有其他非指针类型怎么办?我真的不确定如何处理C联合体,并寻求任何建议。

1个回答

2
cgo文档所述,

由于Go在一般情况下不支持C的union类型,因此C的union类型用具有相同长度的Go字节数组来表示。

也许你应该尝试这个。
type SPC_LINK struct {
    dwLinkChoice  DWORD
    dwLink        [{size of the union}]byte
}

谢谢,我认为{size of the union}将会是联合类型中最长的一个。 - vitr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接