我正在从syscall到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结构作为参数进行系统调用之后,我已经将它存储在内存中并且可以像往常一样在Go中访问它,但是dwLinkChoice(Moniker在上面的代码中)仅始终填充(在上面的代码中)之后的第一个字段,其他两个字段始终为空。我知道这是C语言中的预期行为,因为一次只能有一个联合字段。考虑到这一点,我是否应该忽略整个联合结构,并在Go结构中使用某种占位符?
unsafe.Pointer
dwLinkChoice
Moniker
type SPC_LINK struct { dwLinkChoice DWORD dwLink uintptr // a placeholder, will hold any possible value }
我将占位符的类型设置为uintptr,但是如果原始C结构在联合块中还有其他非指针类型该怎么办?我真的不确定如何处理C并寻找任何建议。
如cgo文档中所述,
由于Go通常不支持C的联合类型,因此C的联合类型表示为具有相同长度的Go字节数组。
也许你应该试试这个
type SPC_LINK struct { dwLinkChoice DWORD dwLink [{size of the union}]byte }