原生 UI
纯 Go 编写、GPU 绘制的界面:flexbox 与 grid 布局、丰富控件、文本编辑与屏幕阅读器支持,完全不需要 webview。
一个小得惊人的二进制文件,同时支持 macOS、Windows 和 Linux。原生 UI 或 Web 前端任选,安装程序与自动更新一应俱全。
同一个应用里,既可以有 MyGo 在 GPU 上绘制的原生 UI 窗口,也可以有运行在系统 webview 中的网页窗口。它们共享窗口选项与事件、菜单和桌面 API。
视图就是关于应用状态的一个 Go 函数。MyGo 调用它构建每一帧,并用 Metal、Direct3D 或 OpenGL 绘制:没有 HTML,没有 JavaScript,没有绑定。窗口即刻打开,只用 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)
}
}页面通过一个自动生成的 TypeScript 客户端调用你的 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)
}
}import { Greeter } from "./mygo"; // 由 Go 代码生成
document.body.textContent = await Greeter.greet("Ada");# 创建 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 绘制 |