go 1.11后应直接用go mod init初始化项目,生成go.mod和go.sum实现依赖自动记录与版本锁定,无需配置gopath或将其代码置于$gopath/src下,否则说明环境仍停留在旧版本。

直接用 go mod 初始化,别碰 GOPATH
Go 1.11 之后模块机制已成标准,GOPATH 不再是必须项,硬设反而容易引发路径冲突或 go get 行为异常。新项目一律从 go mod init 开始,比如:
复制代码go mod init example.com/myapp
这会生成 go.mod 和 go.sum,后续所有依赖自动记录、版本锁定。如果你还在手动配置 GOPATH 或把代码放到 $GOPATH/src 下,说明环境还卡在 Go 1.10 时代。
交叉编译前先确认 GOOS 和 GOARCH 组合是否受支持
Go 支持跨平台编译,但不是所有组合都开箱即用。常见组合如 GOOS=linux GOARCH=amd64 没问题;但若目标是 ARM64 服务器,得写成:GOOS=linux GOARCH=arm64 go build -o myapp
注意:GOOS=darwin GOARCH=arm64(M1/M2 Mac)和 GOOS=windows GOARCH=386(32 位 Windows)仍有效,但 GOOS=ios 等需额外 CGO 配置,普通 HTTP 服务基本用不到。漏设或拼错值会导致编译失败,错误信息通常是:build constraints exclude all Go files 或 cannot find module for path。
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
用 gin.Default() 启动时记得关掉 debug 日志
gin.Default() 自带 Logger 和 Recovery 中间件,开发很爽,但上线后每条请求都会打日志,I/O 开销明显。生产环境应显式切换模式:gin.SetMode(gin.ReleaseMode)
放在 main() 开头即可。否则你会在压测时发现:QPS 上不去,瓶颈不在业务逻辑,而在日志刷盘。另外,gin.H{} 返回的 JSON 不会自动压缩,大响应体建议加 gzip 中间件,而不是靠反向代理补救。
Docker 多阶段构建必须分离 builder 和 runtime 镜像
直接 FROM golang:1.21 并 COPY . . && go build 出来的镜像含完整 Go 工具链,体积常超 900MB。正确做法是两阶段:
- builder 阶段用 golang:1.21-alpine 编译二进制
- final 阶段用 alpine:latest 或 scratch,只 COPY 编译好的可执行文件
关键点:final 镜像不能有 CGO_ENABLED=1,否则会动态链接 libc,scratch 镜像直接 panic。如果用了 sqlite 或其他 cgo 依赖,final 阶段得切回 alpine 并 apk add --no-cache sqlite-dev。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










