作为一个多年的 PHP 开发者,我一直专注于 Web 后端开发,常用的技术栈包括 Laravel、ThinkPHP 等框架,服务器环境则是 Nginx + MySQL + PHP-FPM。平时也经常使用宝塔面板进行快速部署和运维。但是,最近有个小项目需要开发一个桌面应用,PHP 显然不是一个合适的选择。因此,我决定尝试使用 Go 语言,这也是我第一次用 Go 写桌面应用。
为什么选择 Go?
最初的调研阶段,我考虑过 Electron 和 Qt。Electron 基于 JavaScript,上手相对容易,但打包后的体积过于庞大,性能也比较堪忧。Qt 则是 C++ 框架,学习曲线陡峭。最终选择 Go,主要是看中了它的以下几个优点:
- 性能优秀:Go 编译成原生可执行文件,性能接近 C/C++,远超 PHP。对于桌面应用来说,性能至关重要。
- 并发编程:Go 的 Goroutine 和 Channel 机制使得并发编程变得简单高效,可以轻松处理多任务。
- 静态类型:静态类型语言可以在编译时发现很多错误,减少运行时 bug。
- 跨平台编译:Go 支持交叉编译,可以方便地生成 Windows、macOS、Linux 等平台的应用程序。
桌面应用框架选型:wails v2
Go 的桌面应用框架有很多选择,我最终选择了 wails v2。wails v2 的优势在于:
- 使用 Vue.js 构建前端界面:对于前端开发者来说,Vue.js 的学习成本较低。
- Go 代码与前端代码通过 Bridge 进行交互:Wails 提供了一套简洁的 API,方便 Go 代码调用前端方法,以及前端代码调用 Go 方法。
- 自带打包工具:Wails 提供了一键打包命令,可以将应用程序打包成单个可执行文件。
第一个 Go 桌面应用:Hello World
下面是一个简单的 Hello World 示例:
初始化 wails 项目

wails init -n myapp -t vue cd myapp ```
修改
app.go文件
package main import "context" // App struct
type App struct { ctx context.Context }
// NewApp creates a new App application struct
func NewApp() *App {
return &App{}
}
// startup is called when the app starts. The context is passed
// at application startup.
func (a *App) startup(ctx context.Context) {
a.ctx = ctx
}
// Greet returns a greeting
func (a *App) Greet() string {
return "Hello World!"
}
```
修改
frontend/src/components/HelloWorld.vue文件
```
运行程序
wails dev ```
实战避坑经验
- 依赖管理:Go 的依赖管理工具是 Go Modules。在使用 wails 的过程中,经常会遇到依赖冲突的问题。建议使用
go mod tidy命令清理依赖,并使用go mod vendor命令将依赖项复制到vendor目录下。 - 前端资源加载:wails v2 默认使用
embed方式将前端资源嵌入到可执行文件中。如果前端资源过多,会导致可执行文件体积过大。可以考虑将前端资源放到外部目录,并在程序启动时加载。 - 跨平台兼容性:在开发桌面应用时,需要考虑不同平台的兼容性问题。例如,文件路径分隔符在 Windows 和 Linux/macOS 下是不同的。可以使用
path/filepath包来处理平台差异。 - 更新机制:桌面应用的更新是一个重要的问题。可以考虑使用第三方库,例如
go-autoupdate,来实现自动更新。
性能优化
- 减少 Bridge 调用:Go 代码与前端代码之间的 Bridge 调用是有开销的。应该尽量减少 Bridge 调用的次数,将多个操作合并成一个 Bridge 调用。
- 使用 Goroutine 处理耗时任务:对于耗时的任务,应该使用 Goroutine 在后台处理,避免阻塞 UI 线程。
- 优化前端代码:使用 Vue.js 的性能优化技巧,例如使用
v-memo指令缓存静态内容,使用v-once指令只渲染一次内容。
总结:
作为一个 PHP 开发者,我第一次用 Go 写了个桌面应用,虽然遇到了一些坑,但也学到了很多新的知识。Go 语言的性能和并发能力非常适合开发桌面应用。wails v2 框架降低了 Go 桌面应用开发的门槛。希望我的经验可以帮助到更多的 PHP 开发者。
冠军资讯
加班到秃头