webview 是 go 生态最轻量 webview 桌面方案,单文件无依赖、启动快内存低,但仅渲染 web ui、不提供原生控件;需用 github.com/webview/webview,注意路径格式、编码、绑定交互及生命周期管理。

webview 是目前 Go 生态中最轻量、最直接的 WebView 桌面方案,适合已有 HTML 页面、需要快速包装成桌面应用的场景。它不依赖 cgo(Windows/macOS/Linux 均可用),打包后单文件、无运行时依赖(除系统 WebView 引擎外),启动快、内存低。但注意:它不是 GUI 框架,不提供原生控件,所有 UI 都靠 Web 渲染。
用 github.com/webview/webview 启动一个窗口就跑起来
官方维护的 webview 库(非已归档的 zserge/webview)是当前唯一推荐入口。安装和初始化非常直接:
-
go get github.com/webview/webview(注意路径,不是zserge分支) -
w := webview.New(true)中的true表示启用开发者工具(仅调试用,发布前设为false) -
w.SetSize(800, 600, webview.HintNone):第三个参数影响窗口缩放行为,HintNone最稳妥;用HintFixed会禁用拉伸,但用户可能无法调整窗口大小 -
w.SetHtml()只接受字符串,不支持 UTF-8 BOM;若加载中文乱码,确保 Go 源码文件本身是 UTF-8 无 BOM 格式
w.Navigate("file:///") 加载本地 HTML 时路径容易出错
Windows 下 file:///C:/path/index.html 必须是三个斜杠,且盘符大写;Linux/macOS 要用 file:///absolute/path/index.html(开头两个斜杠是协议分隔符,第三个是根路径)。常见错误:
- 用相对路径如
"./index.html"→ERR_FILE_NOT_FOUND - 路径含空格未编码 → Windows 上直接失败,建议用
url.PathEscape处理 - HTML 中引用的 CSS/JS 路径是相对路径 → 在
file://协议下会被浏览器按当前文件目录解析,而非执行目录;推荐统一用<base href=".">或改用绝对file://路径
Go 和 JS 交互必须用 w.Bind(),不能靠全局变量
w.Bind("name", fn) 才能让 JS 调用 Go 函数,绑定后 JS 端通过 window.name(...) 触发。关键点:
- 绑定名必须是合法 JS 标识符(不能含
-、.等) - Go 函数参数类型只能是基础类型或
map[string]interface{}/[]interface{};返回值同理,复杂结构需手动序列化 - JS 调用是异步的,Go 函数执行完才返回结果;若需同步反馈(比如弹窗确认),得在 Go 里调用
w.Eval()回推 JS - 不要在
w.Bind的函数里直接操作 UI(比如修改w.SetTitle),必须用w.Dispatch()包一层,否则 macOS/Linux 下会崩溃
打包发布时 Windows 需加 -ldflags="-H windowsgui"
否则双击 .exe 会先弹黑框再开窗口,体验极差。Linux/macOS 不需要该 flag,但要注意:
- macOS 上必须用
go build编译,不能go run;否则报NSApplication is not running in main thread - Linux 用户若遇到
XOpenDisplay错误,不是 webview 问题,而是系统缺libx11-dev或没装桌面环境(比如纯 server 版 Ubuntu) - 所有平台都不自带 WebView 运行时:Windows 需预装 WebView2(常青版),macOS 10.15+ 自带 WebKit,Linux 需系统有
webkit2gtk-4.1(Ubuntu/Debian 安装libwebkit2gtk-4.1-dev)
w.Run() 控制,它会阻塞主线程并接管消息循环。这意味着你不能在 w.Run() 后写任何 Go 逻辑,也不能用 goroutine 去“绕过”它——所有后续操作(比如后台定时任务、HTTP 服务)必须在 w.Run() 前启动,并确保它们不依赖 UI 线程。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











