本地go playground必须用make build构建,因依赖go 1.20+的embed和io/fs特性,go run会编译失败;构建后执行_output/goplay,默认监听3000端口,需手动访问http://localhost:3000。

本地 Go Playground 搭建必须用 make build,不能 go run
goplay 项目不是普通 Go 程序,它依赖 embed 和 io/fs 特性,Go 1.20 以下版本会直接编译失败。你 clone 下来后进目录,make build 是唯一可靠构建方式——go run . 会报 undefined: fs.FS 或 embed: not supported 错误。构建完二进制在 _output/goplay,直接执行即可,默认监听 :3000,但不会自动打开浏览器,得手动访问 http://localhost:3000。
用户代码执行必须走独立进程,goroutine 隔离完全无效
想安全运行用户提交的 .go 文件,绝不能用 go run 或 goroutine 调用。goroutine 共享内存、全局变量、os.Stdout、http.DefaultClient 和默认 rand.Source,一个 panic 就崩整个服务。正确做法是用 exec.CommandContext 启新进程:
Go语言(Golang)1.26.0版本提供 Go 官方 Windows amd64 MSI 安装包下载入口,版本号 1.26.0,可用于旧项目维护、兼容性测试和指定版本开发环境配置。
- 始终传入带超时的
context.Context,防止卡死 -
cmd.Dir设为干净临时目录(os.MkdirTemp) -
cmd.Env严格白名单,比如只留PATH=/usr/bin:/bin - 重定向
Stdout/Stderr到bytes.Buffer,避免日志混杂 - Linux 下用
syscall.Setrlimit限制地址空间和 CPU 时间
交叉编译无需额外工具链,但 cgo 是个分水岭
Go 原生支持交叉编译,设好 GOOS 和 GOARCH 就行,比如 macOS 上编译 Linux ARM64:GOOS=linux GOARCH=arm64 go build -o app main.go。但一旦启用 cgo(如用了 SQLite、OpenSSL),静态链接失效,就得配对应平台的 C 工具链。最稳妥方案是禁用:CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app main.go。若必须用 cgo,推荐用 Docker 构建,避免本地环境污染。
WASM 编译只认 GOOS=wasm GOARCH=wasm,GOOS=js 已废弃
Go 1.21+ 才真正原生支持 WASM,低于该版本会静默失败或报错。确认方式:go version 输出必须 ≥ go1.21。编译命令只能是:GOOS=wasm GOARCH=wasm go build -o main.wasm main.go。GOOS=js 组合已废弃,生成的是过时的胶水 JS + wasm 混合方案。注意:WASM 模块启动即退出,必须在 main() 末尾调用 syscall/js.Wait() 阻塞;且不能双击 HTML 打开,必须起 HTTP 服务(如 python3 -m http.server 8000)才能加载。
net 在 Windows 上)也会触发 cgo,导致交叉编译产物无法脱离宿主环境运行。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










