我从系统调用获取结果到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
}
在这个Go结构作为参数的unsafe.Pointer
的系统调用之后,我已经将它存储在内存中并且可以像往常一样在Go中访问它,但只能在dwLinkChoice
之后的第一个字段({{总是填充上面代码中的1}},其他两个总是空的。我知道这是C中的预期行为,因为一次只能有一个union字段。考虑到这一点,我应该忽略整个联合结构并在我的Go结构中使用某种占位符吗?
Moniker
我将占位符的类型设置为uintptr,但是如果原始C结构在union块中有其他一些非指针类型会怎么样?我真的不确定如何处理C联盟并寻找任何建议。
答案 0 :(得分:1)
如cgo documentation中所述,
由于Go在一般情况下不支持C&C的联合类型,因此C&C的联合类型表示为具有相同长度的Go字节数组。
也许你应该试试这个
type SPC_LINK struct {
dwLinkChoice DWORD
dwLink [{size of the union}]byte
}