说起界面,这是一道坎,有人或许会说,GO为什么要写界面UI呢,这本来不是GO擅长的部分,也不是GO该干的事情,这句话我就不爱听了。

举个列子,比如我们用GO语言写个服务器,这个服务器就是用作直播视频聊天的服务器,它的功能包含直播房间在线列表人员,当然GO语言设计的时候,服务器记录了在线列表的 userId、roomId、token、level、ip、chatConent等等。比如我们要监视某个房间的人员列表,看他是否用协议刷了人气,其实就是统计一个IP上有多少帐号,或者监控房间里面是否有机器人在发言,并随时封禁它,或者统计在线直播列表的人数等等,我们用命令行是能够操作上述的东西,但是这么多的动作你能记得住那么多的命令吗?

而且上述那么多的东西显示在黑色框子里面,眼睛看久了不累吗?一旦命令行用错了,承担起后果吗?

在命令行里面去选择一个用户或者房间那是一件多么痛苦的事情啊。

而且这些后台管理员又不是技术人员,很可能会出错。

因此界面是必须有的。

GO语言中选择界面是一件纠结的事情,github上面GO-UI要么项目几年没人更新了,要么简单的功能让人不多看一眼。

比如 谷歌自带gxui已经死掉了,goqt的下载一大堆的东西去配置,go-gtk配置也麻烦,而且功能也是简单。

假如在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