Golang可以做界面嗎?
說起界面,這是一道坎,有人或許會說,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