Struct 如何从Windows API访问结构中的联合中的变量?

Struct 如何从Windows API访问结构中的联合中的变量?,struct,go,union,cgo,Struct,Go,Union,Cgo,我得到了未定义的input.ki(类型C.input没有字段或方法ki) 我试着使用“union_uu”前缀,但没有成功 有什么想法吗 主程序包 //#包括 //#包括 输入“C” // http://msdn.microsoft.com/en-us/library/windows/desktop/ms646270(v=vs.85).aspx //typedef结构标记输入{ //德沃德型; //联合{ //小鼠输入mi; //keybdki; //硬件输入hi; // }; //}输入,*

我得到了未定义的
input.ki(类型C.input没有字段或方法ki)

我试着使用“union_uu”前缀,但没有成功

有什么想法吗

主程序包
//#包括
//#包括
输入“C”
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms646270(v=vs.85).aspx
//typedef结构标记输入{
//德沃德型;
//联合{
//小鼠输入mi;
//keybdki;
//硬件输入hi;
//   };
//}输入,*PINPUT;
func main(){
变量输入C.input
var keybdinput C.keybdinput
输入。_type=1//ok!
//input.ki=keybdinput//input.ki未定义(C.input类型没有字段或方法ki)
//input.union_ki=keybdinput//input.union_ki未定义(C.input类型没有字段或方法union_ki)
}

IIRC Go可能无意以任何方式支持访问工会成员。我认为您必须编写一个C包装器访问器函数才能做到这一点。

因为联合破坏了类型安全,所以在Go中访问它们的唯一方法是使用不安全的包。我想你可以这样做:

*(*C.KEYBDINPUT)(unsafe.Pointer(uintptr(unsafe.Pointer(&input)) + unsafe.Sizeof(C.DWORD))) = keybdinput
如果我需要更多地处理这些类型,我会声明包装器类型以使其更容易:

type tagKbdInput struct {
    typ uint32
    ki  C.KEYBDINPUT
}

type tagMouseInput struct {
    typ uint32
    mi  C.MOUSEINPUT
}

type tagHardwareInput struct {
    typ uint32
    hi  C.HARDWAREINPUT
}
然后,我可以通过unsafe.Pointer(没有指针算法)使用更简单的转换来访问它们:

(*tagKbdInput)(unsafe.Pointer(&input)).ki = keybdinput