提及界面,这是一道坎,有人或许会说,GO为何要写界面UI呢,这原本不是GO擅长的部分,也不是GO该干的事情,这句话我就不爱听了。linux
举个列子,好比咱们用GO语言写个服务器,这个服务器就是用做直播视频聊天的服务器,它的功能包含直播房间在线列表人员,固然GO语言设计的时候,服务器记录了在线列表的 userId、roomId、token、level、ip、chatConent等等。好比咱们要监视某个房间的人员列表,看他是否用协议刷了人气,其实就是统计一个IP上有多少账号,或者监控房间里面是否有机器人在发言,并随时封禁它,或者统计在线直播列表的人数等等,咱们用命令行是可以操做上述的东西,可是这么多的动做你能记得住那么多的命令吗?git
并且上述那么多的东西显示在黑色框子里面,眼睛看久了不累吗?一旦命令行用错了,承担起后果吗?github
在命令行里面去选择一个用户或者房间那是一件多么痛苦的事情啊。golang
并且这些后台管理员又不是技术人员,极可能会出错。web
所以界面是必须有的。windows
GO语言中选择界面是一件纠结的事情,github上面GO-UI要么项目几年没人更新了,要么简单的功能让人很少看一眼。服务器
好比 谷歌自带gxui已经死掉了,goqt的下载一大堆的东西去配置,go-gtk配置也麻烦,并且功能也是简单。ui
假如在linux下,我建议仍是选择后面的两个,那是没得选择的选择。命令行
在WINODWS 目前推荐https://github.com/lxn/walk 这个东西,目前在GITHUB上最新的版本是须要GO1.8去构建的,不然百分百会出错。设计
下载下来看下demo
有复制粘帖、数据绑定、图片显示、webkit、绘图、listbox、托盘、tab、滑动条、拖动文件、进度条、按钮、选择框、单选框等等。功能挺全面的,能够去实验下。
先来了解下句柄,什么叫作句柄?句柄能够说是windows上集合全部打开了的界面程序上的控件ID同样,表明了惟一身份,其实底层仍是指针,每次打开程序,句柄由系统随机分配命名,不存在两个句柄是同样的。句柄包含了窗口句柄和控件句柄。
walk下载下来的包这么小,并且编译出来的程序也这么小,那就确定是调用了WINDOWS内置的一些com组件和active控件,这些东西存在于DLL中,通常位于在system32目录下或者程序运行的当前目录下,像QT5这些不是调用window内置的,所以QT编译出来的程序是找不到控件句柄的。好比QQ、YY、迅雷这些软件是找不到控件的句柄的,只能找到窗口句柄,由于这些控件是DX画出来了。
句柄是一个相似整数同样的数值。
在windows设计不一样语言的交互的时候,dll文件是一条逃不过去的坑,先来看下C/C++、GO的类型不一样的定义
Win32 C/C++ golang 字符对照表
WIN32类型 C/C++ 类型 GO 类型 HANDLE void * uintptr BYTE unsigned char uint8, byte SHORT short int16 WORD unsigned short uint16 INT int int32, int UINT unsigned int uint32 LONG long int32 BOOL int int DWORD unsigned long uint32 ULONG unsigned long uint32 CHAR char byte WCHAR wchar_t uint16 LPSTR utf8/char * *byte LPCSTR const utf8/char * *byte, syscall.StringBytePtr(), xc.UTF8PtrToSting() LPWSTR wchar_t * *uint16 LPCWSTR const wchar_t * *uint16, syscall.StringToUTF16Ptr() FLOAT float float32 DOUBLE double float64 LONGLONG __int64 int64 DWORD64 unsigned __int64 uint64