Golang开发桌面应用程序的实践指南

Golang开发桌面应用程序的实践指南 大家好,我学习Go语言已经几个月了,现在有个疑问:是否能用Go开发桌面应用程序?

我正在尝试创建一个可以离线和在线工作的模型。

有没有什么项目或框架可以帮助实现这个目标?

PS:如果我有拼写错误请告诉我,我所在的国家不以英语为母语。

感谢您的时间。

17 回复

我认为小程序技术已经不再是最新的了。

更多关于Golang开发桌面应用程序的实践指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


哦,这真是太棒了,埃里克。我也要看看。

存在多个类似 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工具包就太好了。

此外还有GTK3,它提供了Go语言绑定。

Package gtk

包 gtk

GTK+ 3 的 Go 语言绑定

GTK 用户界面设计可以使用 Glade 工具完成,并通过 GTK.Builder 实现

GitHub 上的代码库看起来需要更多关注,但这是另一个值得考虑的替代方案

希望对您有帮助

当然,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 Logo

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开发经验的开发者。

这些框架都支持跨平台开发,你可以根据项目需求选择。你的拼写没有问题,表达清晰。如果有更多细节,我可以提供更具体的代码示例。

回到顶部