Skip to content

MyGo桌面应用,用 Go 构建

一个小得惊人的二进制文件,同时支持 macOS、Windows 和 Linux。原生 UI 或 Web 前端任选,安装程序与自动更新一应俱全。

小到极致,快到即时 ​

~7MB二进制体积
~44MB内存占用(原生 UI)
~62MB内存占用(含 webview)
0%空闲时的 CPU

两种窗口,一个应用 ​

同一个应用里,既可以有 MyGo 在 GPU 上绘制的原生 UI 窗口,也可以有运行在系统 webview 中的网页窗口。它们共享窗口选项与事件、菜单和桌面 API。

原生 UI无需 webview

视图就是关于应用状态的一个 Go 函数。MyGo 调用它构建每一帧,并用 Metal、Direct3D 或 OpenGL 绘制:没有 HTML,没有 JavaScript,没有绑定。窗口即刻打开,只用 Go 就能构建和运行。

go
type counter struct{ n int }

func (s *counter) view(c *ui.Context) {
	ui.Column(c).Fill().Center().Gap(12).Children(func() {
		ui.Text(c, fmt.Sprint(s.n)).FontSize(40).Bold()
		if ui.PrimaryButton(c, "Increment").Clicked() {
			s.n++
		}
	})
}

func main() {
	s := &counter{}
	mygo.App.WhenReady(func() {
		mygo.NewWindow(mygo.WindowOptions{
			Title:   "Counter",
			Content: ui.View(s.view),
		})
	})
	if err := mygo.App.Run(); err != nil {
		log.Fatal(err)
	}
}
Web 前端类型化绑定

页面通过一个自动生成的 TypeScript 客户端调用你的 Go 代码:类型来自你的结构体,文档来自你的方法注释。

go
type Greeter struct{}

// Greet 返回一句问候。
func (Greeter) Greet(name string) string { return "Hello, " + name }

func main() {
	mygo.Bind(Greeter{})
	mygo.App.WhenReady(func() {
		mygo.NewWindow(mygo.WindowOptions{Title: "Hello", URL: "/"})
	})
	if err := mygo.App.Run(); err != nil {
		log.Fatal(err)
	}
}
ts
import { Greeter } from "./mygo"; // 由 Go 代码生成

document.body.textContent = await Greeter.greet("Ada");
开始一个项目
sh
# 创建 Web 前端项目
$ bunx mygo-cli init my-app

# 创建原生 UI 项目
$ go run github.com/egoist/mygo/cmd/mygo@latest init -template native my-app
跨平台支持
平台Web 页面窗口需要原生 UI 窗口需要
macOS 12 或更高无需额外依赖:WKWebView 是系统组件无需额外依赖:使用 Metal 绘制
Linux(x64、arm64)GTK 3 与 WebKitGTK 4.1(或 4.0)仅需 GTK 3
Windows 10 与 11(x64、arm64)WebView2 运行时(Windows 11 自带)无需额外依赖:使用 Direct3D 11 绘制

开发应用只需要 Go 1.27 或更高版本;含 Web 前端的项目还需要 Bun。