Skip to content

快速开始 ​

MyGo 应用以两种方式显示窗口:用 Web 前端(在系统的 webview 中),或用 MyGo 自己绘制、以 Go 编写的原生 UI。mygo init 可以创建 其中任一种项目,应用之后也可以添加另一种窗口。

安装 ​

安装 Go 1.27 或更高版本。含 Web 前端的项目还需要 Bun 来运行其工具;含有网页的应用需要系统的 webview:

  • Linux 上:GTK 3 和 WebKitGTK 4.1,例如在 Debian 和 Ubuntu 上执行 sudo apt install libwebkit2gtk-4.1-0;
  • Windows 10 上:WebView2 运行时, Windows 11 已内置。

原生 UI 不再需要其他东西:Go 构建应用,应用依靠系统已有的东西运行 (Linux 上是 GTK 3)。

mygo 命令行工具用于创建、运行和打包应用。它本身是一个 Go 程序,Go 无需 安装即可运行它:

sh
go run github.com/egoist/mygo/cmd/mygo@latest init my-app

含 Web 前端的项目也通过 npm 依赖它,即 mygo-cli 包,因此也可以用 Bun 或 npm 创建项目:

sh
bunx mygo-cli init my-app      # or: npx mygo-cli init my-app

你也可以用 Go 安装 CLI,这会把 mygo 放进你的 PATH:

sh
go install github.com/egoist/mygo/cmd/mygo@latest
mygo init my-app

mygo doctor 检查本机是否具备 MyGo 所需的东西。

创建项目 ​

Web 前端 ​

mygo init my-app 会创建一个 Go 模块和一个用 Vite 构建的 TypeScript 前端,二者并列存放,并安装它们的依赖:

my-app/
├── main.go          the app: its windows and the Go code the page calls
├── go.mod
├── mygo.config.ts   the app's name, identifier and version, and how to build it
├── package.json     the scripts, and the frontend's dependencies
├── index.html       the page
├── src/
│   ├── main.ts      the page's code
│   ├── style.css
│   └── mygo.ts      the typed client of the Go code, generated
├── vite.config.ts
├── tsconfig.json
└── resources/
    └── icon.png     the app icon, a 1024×1024 PNG

构建产物放在 dist/(前端)和 build/(打包后的应用),开发版应用放在 .mygo/;.gitignore 会忽略它们。mygo.config.ts 的字段见 配置。

原生 UI ​

mygo init -template native my-app 创建一个窗口显示原生 UI 的应用:只有一个 Go 模块,没有前端,也不需要 Bun。

my-app/
├── main.go          the app: its state, its view and its window
├── main_test.go     a test of the view, which runs without a window
├── go.mod           with the CLI as a tool
├── mygo.json        the app's name, identifier and version
└── resources/
    └── icon.png     the app icon, a 1024×1024 PNG

该模块把 CLI 作为一个 工具:go tool mygo 按 go.mod 固定的版本运行它, go get -tool github.com/egoist/mygo/cmd/mygo@latest 会随 MyGo 一起更新它。

开发 ​

sh
cd my-app
bun run dev        # a web frontend: runs mygo dev
go tool mygo dev   # native UI

mygo dev 构建应用的开发版并启动它;当你编辑 .go 文件、配置、图标或资源 时,它会重新构建并重启。编译失败的构建会保留上一个继续运行。退出应用或按 Ctrl+C 即可停止。

对于 Web 前端,它还会写入 src/mygo.ts 并启动 Vite 开发服务器,开发版应用 从中加载页面:编辑 src/main.ts 或 src/style.css,Vite 会立即更新页面。 开发构建带有 Web 检查器:右键点击页面并选择 Inspect Element(Windows 上是 Inspect),或调用 win.Page().OpenDevTools()。

在 macOS 上,开发版应用是一个真正的应用包,名为 My App Dev,标识符是 应用的标识符加上 .dev,从而使其数据、偏好和权限与已安装的应用相互隔离。

调用 Go ​

从页面 ​

main.go 绑定一个 Go 值,页面可以调用它导出的方法:

go
// Greeter 可从前端调用:`mygo generate` 会把它的方法
// 转换为 src/mygo.ts 中带类型的 TypeScript 函数。
type Greeter struct{}

// Greet 返回针对 name 的问候。
func (Greeter) Greet(name string) string {
	if name == "" {
		name = "stranger"
	}
	return "Hello, " + name + "! This message comes from Go."
}

// Tick 每秒发送给页面。
var Tick = mygo.NewEvent[time.Time]("tick")

func main() {
	mygo.Bind(Greeter{})
	// ...
}

src/mygo.ts 由 mygo dev 保持最新,它把这些方法转换成带类型的函数和事件:

ts
import { Greeter, events } from "./mygo";

const greeting = await Greeter.greet("Ada"); // Promise<string>
events.tick.on((time) => console.log(time)); // time: string

给 Greeter 添加一个方法并保存,应用重启后就可以调用它。 从前端调用 Go 介绍了方法可以接受和返回什么、错误、事件与 安全性。

从原生 UI ​

原生 UI 就是 Go,因此它直接调用你的代码,无需绑定。视图是 MyGo 为构建每 一帧而调用的、关于应用状态的函数;它会询问各元素自上一帧以来发生了什么:

go
func (a *app) view(c *ui.Context) {
	ui.Column(c).Fill().Center().Gap(16).Children(func() {
		ui.TextInput(c, &a.name).Placeholder("Your name").Width(240)
		if ui.PrimaryButton(c, "Greet").Clicked() {
			a.greeting = greet(a.name) // your Go code
		}
		ui.Text(c, a.greeting)
	})
}

main_test.go 无需窗口就能对视图进行点击和输入,快如单元测试:运行 go test 即可。原生 UI 介绍了布局、控件、文本、输入、 绘制,以及从其他 goroutine 修改状态。

构建 ​

sh
bun run build        # a web frontend: runs mygo build
go tool mygo build   # native UI

mygo build 编译应用(如有由 Vite 构建的前端,会嵌入其中),并按本机平台 打包到 build/<os>-<arch>/:

平台产物
macOSMy App.app,以及磁盘镜像 my-app-0.1.0-arm64.dmg
WindowsMy App.exe,以及安装程序 my-app-setup-0.1.0-amd64.exe
Linux可执行文件 my-app 及其桌面入口和图标、包含它们的压缩包连同 install.sh(为用户安装),以及一个 .deb 包

MyGo 不需要 cgo,因此任何机器都能为所有平台构建:

sh
bun run build -- -platform darwin/universal,windows/amd64,linux/amd64
go tool mygo build -platform darwin/universal,windows/amd64,linux/amd64

应用可以在原地运行,但要发布给用户,需要签名:见 构建与分发。

后续步骤 ​

  • 窗口和应用程序,塑造应用的形态。
  • 原生 UI,用 Go 构建界面;或前端,用于网页。
  • 菜单与托盘和桌面 API。
  • 仓库中的示例:
    • 网页应用:examples/hello(最小的应用)、examples/todo (带类型的服务与事件、持久化、对话框、菜单、多窗口)、 examples/frameless(自定义标题栏)和 examples/native(菜单、托盘图标、对话框、通知、全局快捷键、 剪贴板和深色模式);
    • 原生 UI:examples/clipboard(复制与拖拽文本、HTML、 惰性 JSON 和文件列表)、examples/counter-native(一个计数器,其视图 带有测试)、examples/vibrancy(内嵌标题栏下的半透明侧边栏,在其中 选取材质)、examples/effort-slider(重绘的一个 Web 演示的动画滑块: 字母模糊浮现、像素迸发、卡片抖动)、examples/confetti (canvas-confetti 的演示,每一片彩纸都只按用于绘制的姿态飞行)、 examples/wind(Claude 应用 Code 标签背后的字形纹理:字符被掠过的风 点亮,点击泛起涟漪,由两个用 Go 编写的着色器绘制)、 examples/blackhole(一个黑洞,其光线由着色器穿过引力追踪:引力透镜化 的吸积盘、多普勒增亮和由恒星组成的爱因斯坦环,三个通道并带泛光)、 examples/chat-glow(如 Apple Intelligence 般点亮的助手:它在思考时 窗口边缘发光,锥形渐变的模糊边框,以及发光场、闪烁文字和光球,均为 着色器)、examples/timeline(单一播放头驱动的开场动画:一张卡片滑入, 其标题与各行跟随其后,支持播放、暂停、倒放和重新开始)和 examples/gallery(工具包巡礼:布局、控件、文本编辑、一万行的列表、 绘制与叠加层)。