輕松入門:使用Golang開發(fā)跨平臺(tái)GUI應(yīng)用
基礎(chǔ)操作
requires:Go 1.11.x or later
安裝依賴
go get github.com/lxn/walk go get github.com/akavel/rsrc rsrc
創(chuàng)建文件 go-gui/gui.go
package main
import (
"strings"
"github.com/lxn/walk"
. "github.com/lxn/walk/declarative"
)
func main() {
var inTE, outTE *walk.TextEdit
MainWindow{
Title: "xiaochuan測(cè)試",
MinSize: Size{600, 400},
Layout: VBox{},
Children: []Widget{
HSplitter{
Children: []Widget{
TextEdit{AssignTo: &inTE, MaxLength: 10},
TextEdit{AssignTo: &outTE, ReadOnly: true},
},
},
PushButton{
Text: "SCREAM",
OnClicked: func() {
outTE.SetText(strings.ToUpper(inTE.Text()))
},
},
},
}.Run()
}go mod init go-gui
創(chuàng)建后綴為manifest的文件
go-gui/go-gui.exe.manifest
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0" processorArchitecture="*" name="SomeFunkyNameHere" type="win32"/>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
</dependentAssembly>
</dependency>
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2, PerMonitor</dpiAwareness>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">True</dpiAware>
</windowsSettings>
</application>
</assembly>rsrc -manifest go-gui.exe.manifest -o rsrc.syso go build -ldflags="-H windowsgui"
雙擊 go-gui.exe

文件go-gui.exe可以復(fù)制到任何地方直接運(yùn)行,因?yàn)橐呀?jīng)將manifest文件編譯進(jìn)去了。
添加圖標(biāo)
rsrc -manifest go-gui.exe.manifest -ico favicon.ico -o rsrc.syso go build -ldflags="-H windowsgui"
favicon.ico為下載的圖標(biāo)文件,效果如下。

運(yùn)行程序,任務(wù)欄上的圖標(biāo)也變成了這個(gè)。
具體說(shuō)明
1、manifest 文件
這個(gè)東西的作用就是為了解決 以前windows上的“Dll 地獄” 問題才產(chǎn)生的新的DLL管理解決方案。大家知道,Dll是動(dòng)態(tài)加載共享庫(kù),同一個(gè)Dll可能被多個(gè)程序所使用,而所謂“Dll 地獄”就是當(dāng)不通程序依賴的Dll相同,但版本不同時(shí),由于系統(tǒng)不能分辨到底哪個(gè)是哪個(gè),所以加載錯(cuò)了Dll版本,然后就掛了。于是蓋茨就吸取了教訓(xùn),搞了一個(gè)程序集清單的東西,每個(gè)程序都要有一個(gè)清單,這個(gè)清單存再和自己應(yīng)用程序同名的.manifest文件中,里面列出其所需要的所有依賴,這兒所列出的依賴可不是簡(jiǎn)單地靠文件明來(lái)區(qū)分的,而是根據(jù)一種叫做“強(qiáng)文件名”的東西區(qū)分的。。。。。。
2、rsrc程序的作用
rsrc - Tool for embedding binary resources in Go programs.
Generates a .syso file with specified resources embedded in .rsrc section,
aimed for consumption by Go linker when building Win32 excecutables.
The generated *.syso files should get automatically recognized by 'go build'
command and linked into an executable/library, as long as there are any *.go
files in the same directory.
OPTIONS:
-arch string
architecture of output file - one of: 386, amd64, [EXPERIMENTAL: arm, arm64] (default "amd64")
-ico string
comma-separated list of paths to .ico files to embed
-manifest string
path to a Windows manifest file to embed
-o string
name of output COFF (.res or .syso) file; if set to empty, will default to 'rsrc_windows_{arch}.syso'rsrc將靜態(tài)資源文件編譯到syso文件中,go語(yǔ)言在最新版本中已經(jīng)支持syso文件的鏈接并且會(huì)搜索當(dāng)前目錄,自動(dòng)鏈接。
在Go1.16起引入了embed包,也可以實(shí)現(xiàn)將靜態(tài)文件編譯進(jìn)去。參考:https://www.php.cn/be/go/484192.html
本機(jī)安裝的是Go1.14,沒有辦法演示使用 embed 的方式加載 manifest 文件。
當(dāng)然,我們也可以不將 manifest文件編譯進(jìn)去,比如,我的目錄下只有g(shù)ui.go和go-gui.exe.manifest文件,然后使用go build -ldflags="-H windowsgui"來(lái)編譯。得到go-gui.exe,注意,此時(shí)的manifest文件名一定要是go-gui.exe.manifest。點(diǎn)擊go-gui.exe,效果一樣,只是,go-gui.exe和go-gui.exe.manifest要在同一個(gè)目錄下。
3、參數(shù)-ldflags="-H windowsgui"的意義
正常情況下,任何語(yǔ)言開發(fā)的GUI都會(huì)伴隨著一個(gè)CMD框在后面,比如這樣

是的,如果僅僅使用go build來(lái)編譯的話,就是這個(gè)效果,帶上參數(shù)-ldflags="-H windowsgui"就會(huì)去掉后面的CMD框。
這個(gè)CMD框的作用是打印信息,輸出等。
另外,還可以壓縮一下生成的程序的大?。?ldflags="-H windowsgui -w"
關(guān)于 golang GUI
win
win把win32 api幾乎所有相關(guān)的聲明都導(dǎo)成了go。如果發(fā)現(xiàn)有沒導(dǎo)出的,可以參照里面的方法導(dǎo)出,很簡(jiǎn)單的。
walk
是對(duì)win包的再次封裝,方便使用。
fyne
文檔相對(duì)豐富一些。
govcl
總結(jié):
- Golang是一種強(qiáng)大的編程語(yǔ)言,可以用于開發(fā)GUI桌面應(yīng)用。
- 通過(guò)使用Golang的GUI庫(kù),開發(fā)人員可以輕松地創(chuàng)建具有豐富用戶界面和交互功能的應(yīng)用程序。
- Golang的并發(fā)性和高性能使其成為開發(fā)桌面應(yīng)用的理想選擇。
- Golang提供了豐富的標(biāo)準(zhǔn)庫(kù)和第三方庫(kù),可以幫助開發(fā)人員快速構(gòu)建跨平臺(tái)的應(yīng)用程序。
- 此外,Golang的靜態(tài)類型和自動(dòng)垃圾回收機(jī)制使得開發(fā)過(guò)程更加穩(wěn)定和可靠。
無(wú)論是開發(fā)桌面應(yīng)用程序還是移動(dòng)應(yīng)用程序,Golang都是一個(gè)強(qiáng)大的選擇。通過(guò)使用Golang開發(fā)GUI桌面應(yīng)用,開發(fā)人員可以享受到高效、可靠和易于維護(hù)的開發(fā)體驗(yàn)。
到此這篇關(guān)于輕松入門:使用Golang開發(fā)跨平臺(tái)GUI應(yīng)用的文章就介紹到這了,更多相關(guān)golang開發(fā)GUI桌面應(yīng)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go語(yǔ)言LeetCode題解1030距離順序排列矩陣單元格
這篇文章主要為大家介紹了go語(yǔ)言LeetCode題解1030距離順序排列矩陣單元格,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
使用Go進(jìn)行單元測(cè)試的實(shí)現(xiàn)
這篇文章主要介紹了使用Go進(jìn)行單元測(cè)試的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
Go語(yǔ)言對(duì)JSON進(jìn)行編碼和解碼的方法
這篇文章主要介紹了Go語(yǔ)言對(duì)JSON進(jìn)行編碼和解碼的方法,涉及Go語(yǔ)言操作json的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02
golang架構(gòu)設(shè)計(jì)開閉原則手寫實(shí)現(xiàn)
這篇文章主要為大家介紹了golang架構(gòu)設(shè)計(jì)開閉原則手寫實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
Go語(yǔ)言使用Json的方法實(shí)現(xiàn)
本文主要介紹了Go語(yǔ)言使用Json的方法實(shí)現(xiàn)2024-05-05
GO的基礎(chǔ)知識(shí)掃盲注意事項(xiàng)
這篇文章主要介紹了GO的基礎(chǔ)知識(shí)注意事項(xiàng),本文是GO語(yǔ)言小白的掃盲文,主要講解了go語(yǔ)言的基本知識(shí),GO程序目錄結(jié)構(gòu),GO程序包的導(dǎo)入與別名運(yùn)用,GO內(nèi)置關(guān)鍵字,GO注釋方法需要的朋友可以參考下2022-12-12
Golang基礎(chǔ)學(xué)習(xí)之map的示例詳解
哈希表是常見的數(shù)據(jù)結(jié)構(gòu),有的語(yǔ)言會(huì)將哈希稱作字典或者映射,在Go中,哈希就是常見的數(shù)據(jù)類型map,本文就來(lái)聊聊Golang中map的相關(guān)知識(shí)吧2023-03-03

