外观
快速开始
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-appmygo 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 UImygo 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 UImygo build 编译应用(如有由 Vite 构建的前端,会嵌入其中),并按本机平台 打包到 build/<os>-<arch>/:
| 平台 | 产物 |
|---|---|
| macOS | My App.app,以及磁盘镜像 my-app-0.1.0-arm64.dmg |
| Windows | My 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(工具包巡礼:布局、控件、文本编辑、一万行的列表、 绘制与叠加层)。
- 网页应用: