Golang开发桌面应用程序的实践指南
Golang开发桌面应用程序的实践指南 大家好,我学习Go语言已经几个月了,现在有个疑问:是否能用Go开发桌面应用程序?
我正在尝试创建一个可以离线和在线工作的模型。
有没有什么项目或框架可以帮助实现这个目标?
PS:如果我有拼写错误请告诉我,我所在的国家不以英语为母语。
感谢您的时间。
哦,这真是太棒了,埃里克。我也要看看。
有一个有趣的项目 https://github.com/zserge/lorca
存在多个类似 electron 的项目,您可以使用 HTML 和 JavaScript 编写 GUI。
尽管它仍处于alpha阶段,但我最近一直在使用这个包,体验非常棒。
是的,我找到了很多关于这方面的教程,而且我打算专注于这些内容,因为我对HTML之类的东西很熟悉。但在做决定之前,我会逐一查看所有的教程。
我明白了,感谢分享。我现在正全力投入学习 Go 语言,所以在某些方面还不太熟悉。我是通过 Udemy 上的一门课程来到这里的,并开始深入探索,查看一些帖子和相关内容。
我仍然建议你尝试使用Buffalo,先构建一个普通的Web应用,然后将其打包成单个二进制文件。
执行该文件时,它会在指定端口启动服务器。
这样你既能获得HTML和JavaScript的强大功能和便捷性,又能在应用中充分发挥Web技术的全部优势。
而且目前也没有其他更成熟的库可供选择。
我认为你应该尝试使用beego或buffalo框架。通过创建完整的Web应用程序,你可以生成一个二进制文件,该文件会在本地端口上运行服务器,任何访问该端口的人都能使用这个Web应用。
这种方法非常简单且没有任何限制。我已经尝试过并且运行良好。只需创建一个二进制文件亲自验证即可。这两个框架都有生成二进制文件的命令。
是的,jayts。我看到了你关于这个主题的帖子,我觉得非常棒,希望在不久的将来能尝试一下。 目前我正在熟悉 Golang 及其生态系统。已经开始研究一些 API 框架,比如 gin-gonic 😛 不过还是感谢你的澄清。我正从 PHP、Java 和 C# 转向 Golang(至少让它成为我的主要语言),对 C/C++ 只有一些基础了解。
长期以来围绕Go语言和图形用户界面进行了许多讨论,但我从未听说过成熟完整的解决方案。经过九年时间,我推测近期内不太可能出现这样的解决方案。当然存在一些或多或少有用的尝试,但正如我一直强调的,除非有大公司长期支持开发这类工具包,否则很难看到实质性的成果。
iegomez: 虽然还处于alpha阶段,但我最近一直在使用这个包,体验非常棒。
感谢推荐。等我有时间了一定要试试看。
Qt的学习曲线非常陡峭。它从1990年代就开始开发,虽然功能强大,但体系庞大且复杂。
我一直认为如果Go能拥有自己的GUI工具包就太好了。
当然,gtk+ 值得关注。几年前,我在研究适用于跨平台(Linux、macOS、Windows)开发的 C 和 C++ GUI 工具包时,发现了三个候选者:Qt、gtk+ 和 wxWindows。
现在我使用 Go 语言编程,已经习惯了这样的理念:开发应该简单、快速且有趣。我一直在思考,是否应该专注于用 Go 编写的工具包,这样既能跨平台,又能在 Go 支持的所有平台上运行。
(这是另一个话题,但我也希望实现跨平台音频支持。目前 Qt 在这方面有所涉及,但还不够完善。)
是的,Qt 对于大多数需要添加漂亮图形界面的场景来说似乎有些大材小用。每隔几个月我都会查看 Go 语言中新的图形解决方案,上次发现了这个包。虽然文档极其匮乏,但由于它是作者用 C 语言编写的另一个图形库的封装,代码本身相当直观,很容易快速上手。
我稍微尝试过并希望更多使用的另一个图形库是 Pixel,不过它更侧重于 2D 游戏开发。但你当然可以用它来制作一些很棒的图形界面。
我也希望能有一些优秀的图形界面工具包,但我不认为短期内会出现官方或社区支持的工具包。所以目前要么使用这类解决方案,要么选择 Qt、Gtk 等的绑定库。
我猜你是在询问桌面应用的GUI开发方案。目前Go语言直接支持基于文本的应用程序,如果你需要图形界面工具包或框架,就需要寻找第三方包。
虽然我还没有亲自尝试过,但发现这个项目非常有意思:https://github.com/therecipe/qt
这是Qt框架的Go语言绑定(https://www.qt.io/),可以说这是开发跨平台GUI桌面应用程序的最佳方案。再看看最近更新的评论:看起来正在添加对WebAssembly的支持!我平时不容易激动,但这次真的让我忍不住惊叹——这太酷了!
这个网页是关于使用C/C++配合Qt和WebAssembly的,但看看人们利用Qt的WebAssembly支持实现了什么:

Qt for WebAssembly - 查看示例! - Qt博客
Qt for WebAssembly使得将Qt应用程序构建为WebAssembly模块以在Web浏览器中运行成为可能。我们为您准备了一些示例!
所有这些技术都非常新颖!所以暂时不要期待完美无缺。如果你尝试并成功运行了任何功能,请回来告诉我们你的经验!
是的,Go语言可以用于开发桌面应用程序。虽然Go主要设计用于后端和系统编程,但通过一些框架和绑定,你完全可以创建跨平台的桌面应用。以下是一些常用的选项和示例:
1. 使用 Fyne 框架
Fyne 是一个基于Go的跨平台GUI工具包,支持Windows、macOS和Linux。它易于使用,并提供丰富的UI组件。
安装 Fyne:
go get fyne.io/fyne/v2
示例代码:创建一个简单的窗口:
package main
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func main() {
myApp := app.New()
myWindow := myApp.NewWindow("Hello Desktop App")
hello := widget.NewLabel("Hello, Go Desktop App!")
button := widget.NewButton("Click Me", func() {
hello.SetText("Button clicked!")
})
content := container.NewVBox(hello, button)
myWindow.SetContent(content)
myWindow.ShowAndRun()
}
运行此代码将显示一个带标签和按钮的窗口。点击按钮会更新标签文本。
2. 使用 Wails 框架
Wails 允许你使用Go作为后端,并结合前端技术(如HTML、CSS、JavaScript)构建桌面应用。它支持离线/在线模式,并自动处理跨平台构建。
安装 Wails:
go install github.com/wailsapp/wails/v2/cmd/wails@latest
wails init -n myapp -t react
示例代码:一个简单的Wails应用:
- 在Go后端定义一个结构体和方法:
package main
import "context"
type App struct {
ctx context.Context
}
func NewApp() *App {
return &App{}
}
func (a *App) startup(ctx context.Context) {
a.ctx = ctx
}
func (a *App) Greet(name string) string {
return "Hello, " + name + "!"
}
- 在前端(如React)调用Go方法:
import { invoke } from '@tauri-apps/api/tauri';
async function greet() {
let greeting = await invoke('greet', { name: 'World' });
console.log(greeting);
}
3. 使用 Go-astilectron
Go-astilectron 结合了Go和Electron,允许你使用Web技术构建桌面应用,同时用Go处理后端逻辑。
安装:
go get github.com/asticode/go-astilectron
示例代码:启动一个Electron窗口:
package main
import (
"github.com/asticode/go-astilectron"
"log"
)
func main() {
a, err := astilectron.New(nil, astilectron.Options{
AppName: "My Go App",
})
if err != nil {
log.Fatal(err)
}
defer a.Close()
a.Start()
w, err := a.NewWindow("http://localhost:3000", &astilectron.WindowOptions{
Width: astilectron.IntPtr(800),
Height: astilectron.IntPtr(600),
})
if err != nil {
log.Fatal(err)
}
w.Create()
a.Wait()
}
离线/在线工作模型
对于离线/在线功能,你可以:
- 使用Go的内置数据库(如SQLite)存储离线数据。
- 通过HTTP客户端(如
net/http包)与在线服务同步数据。
示例:使用SQLite存储数据:
package main
import (
"database/sql"
"log"
_ "github.com/mattn/go-sqlite3"
)
func main() {
db, err := sql.Open("sqlite3", "./data.db")
if err != nil {
log.Fatal(err)
}
defer db.Close()
_, err = db.Exec("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)")
if err != nil {
log.Fatal(err)
}
}
总结
- Fyne:适合纯Go GUI应用,简单轻量。
- Wails:适合结合前端技术,提供丰富的UI可能性。
- Go-astilectron:基于Electron,适合有Web开发经验的开发者。
这些框架都支持跨平台开发,你可以根据项目需求选择。你的拼写没有问题,表达清晰。如果有更多细节,我可以提供更具体的代码示例。

