GoLand不支持WebAssembly图形化编译,必须通过External Tools配置go build -o main.wasm main.go并设置GOOS=js GOARCH=wasm;需手动复制wasm_exec.js,调试依赖浏览器DevTools。

GoLand 本身不提供 WebAssembly 编译目标的图形化开关,所有 wasm 编译必须通过命令行环境变量控制;直接点 Run 按钮会失败,因为 GoLand 默认用 go run,而它根本不支持 GOOS=js GOARCH=wasm。
GoLand 里不能用 Run 按钮编译 wasm
GoLand 的绿色三角形 Run 按钮本质是调用 go run main.go,这个命令硬编码忽略 GOOS/GOARCH 设置,且 wasm 目标不支持 go run。你点下去只会看到 build constraints exclude all Go files 或空白输出——不是配置错,是机制上就不允许。
- 必须关闭 Run 配置里的 “Use go run” 选项(如果存在),但即使关了,GoLand 也不会自动注入
GOOS=js GOARCH=wasm - 不要尝试在 Run Configuration 的 “Program arguments” 里填
-ldflags="-s -w"这类参数,它们对 wasm 编译无效 - GoLand 的 Build 工具链(如
go build)默认也不读取 shell 环境变量,所以你在终端 export 的GOOS对 IDE 内部构建无影响
正确做法:用 External Tools 绑定编译命令
GoLand 支持把任意命令注册为外部工具,这是最稳定、可复用的 wasm 编译方式。
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
- 打开 File → Settings → Tools → External Tools(macOS 是 GoLand → Preferences → Tools → External Tools)
- 点击 + 号,填入:
-
Name:
Build WASM -
Program:
go(确保路径正确,可用which go确认) -
Arguments:
build -o main.wasm main.go -
Working directory:
$ProjectFileDir$ -
Environment variables:
GOOS=js;GOARCH=wasm(注意分号分隔,Windows 也用分号)
-
Name:
- 保存后,右键
main.go→ External Tools → Build WASM,就能生成main.wasm
调试 wasm 代码只能靠浏览器 DevTools
GoLand 的 Debugger 完全无法 attach 到浏览器中运行的 wasm 实例——Go 的 wasm runtime 没有暴露调试协议,dlv 也不支持 wasm 目标。你写的 fmt.Println 会输出到浏览器 console,panic 会变成 Uncaught RuntimeError: unreachable。
- 所有日志、断点、变量检查,都得切到 Chrome/Firefox 的 Sources 或 Console 面板里做
- 想看 Go 堆栈?打开 DevTools → Sources → Page →
main.wasm(可能显示为(no domain)),但符号是 stripped 的,只能靠js.Global().Get("console").Call("debug", ...)手动打点 - 别在 GoLand 里开 “Debug” 按钮,它只会卡住或报
could not launch process
wasm_exec.js 必须手动复制,GoLand 不会自动生成
GoLand 不知道你要跑 wasm,更不会帮你从 $GOROOT/misc/wasm/wasm_exec.js 复制胶水脚本。漏掉它,浏览器加载时必报 ReferenceError: Go is not defined 或 global is not defined。
- 终端执行:
cp "$(go env GOROOT)/misc/wasm/wasm_exec.js" . - 确保 HTML 中
<script src="wasm_exec.js"></script>在<script>...go.run()</script>之前 - 每次升级 Go 版本后,必须重新复制
wasm_exec.js——混用 v1.21 和 v1.23 的胶水脚本会导致undefined symbol: runtime.wasmExit
真正麻烦的不是编译那条命令,而是胶水脚本版本、MIME 类型、阻塞逻辑这三处:缺一不可,错一个就白编译。GoLand 只能帮你敲命令,剩下的全是浏览器环境的事。

















