提及界面,這是一道坎,有人或許會說,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