go 1.16+ 必须显式设 go111module=on,否则可能回退 gopath 模式导致 go mod init 失败;无需配置 gopath,设了反而易冲突;go run 不走 vendor 且忽略 -ldflags,调试需用 go build 二进制。

go version 能跑通,不代表环境就 ready 了
很多新手在 go version 输出成功后就认为 Go 环境装好了,结果一跑 go mod init 就报 go: cannot find main module,或者 go run 提示找不到包。根本原因不是 Go 没装对,而是没启用 Modules 模式或 GOPATH 干扰还在。
现代 Go(1.16+)默认开启 Modules,但如果你机器上残留旧版 GOPATH 配置、或者当前目录不在模块根下,go 命令会回退到 GOPATH 模式,导致依赖无法解析、go get 失败、vendor 不生效等连锁问题。
- 执行
go env -w GO111MODULE=on强制启用 Modules(推荐,一劳永逸) - 确认当前目录有
go.mod:没有就先go mod init myproject - 删掉
$HOME/go/src下的旧项目(尤其当你以前用 GOPATH 开发过),避免go build错误地从那里找包 - 不要手动设置
GOPATH—— 新项目完全不需要它,设了反而容易冲突
go build -o 编译失败?先看 -ldflags 和 -gcflags 是否写错
go build 表面简单,但生产编译常因参数顺序或拼写出错直接失败。比如想注入版本号,写成 go build -ldflags "-X main.Version=1.0" . 看似没问题,但若 main.Version 对应变量不存在(比如是 version 小写),链接器不会报错,运行时却为空;更隐蔽的是 -X 只接受 importpath.name=value 格式,不能带空格或引号嵌套。
Go语言(Golang)1.26.0版本提供 Go 官方 Windows amd64 MSI 安装包下载入口,版本号 1.26.0,可用于旧项目维护、兼容性测试和指定版本开发环境配置。
-
-ldflags中的-X必须匹配变量声明:如果代码里是var Version string,就得用-X main.Version=1.2.3;如果是var version string,则必须小写-X main.version=1.2.3 -
-gcflags传给编译器,常见用于禁用内联:-gcflags="-l"(注意等号紧贴,不能有空格) - 参数顺序有影响:
-o必须放在最后或紧接文件名后,go build -v -o app .正确,go build -o app -v .也行,但go build -o -v app .会把-v当作输出文件名 - 交叉编译记得清掉 CGO:
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -o app-arm64 .,否则可能 link 失败
go run 和 go build 的临时文件位置不同,调试时别搞混
go run main.go 看起来方便,但它会在 $TMPDIR(Linux/macOS 是 /tmp)下生成并执行一个随机命名的可执行文件,跑完就删。这意味着你用 ps aux | grep myapp 找不到进程名,lsof -i :8080 也看不到绑定详情——因为进程名是类似 go-build123456789/b001/exe/main 这样的临时路径。
- 想查真实进程信息,用
go build -o myapp && ./myapp,这样进程名就是myapp -
go run不走go.modvendor 目录(即使开了-mod=vendor),它始终从 $GOMODCACHE 拉依赖;而go build -mod=vendor才真正使用./vendor - 调试时若需 attach 进程(如用 delve),必须用
go build出的二进制,go run的临时文件生命周期太短,delve 很难稳定 attach -
go run会忽略-ldflags里的-X注入,除非显式加-ldflags参数:go run -ldflags="-X main.Version=dev" main.go
CI/CD 中 go build 失败,大概率是 GOPROXY 或缓存问题
本地能编译,CI 上却卡在 go: downloading example.com/pkg v1.2.3 或报 module lookup failed,通常不是代码问题,而是环境缺失代理或模块缓存不一致。
- CI 默认没配
GOPROXY,国内建议统一设为https://goproxy.cn,direct(支持 fallback 到 direct) - GitLab CI 或 GitHub Actions 中,
go mod download最好显式执行一次,避免go build时边下载边编译导致超时 - 如果用了私有模块(如公司内网 Git),必须确保
GOINSECURE包含对应域名,否则 TLS 验证失败 - Docker 构建时,
go mod download应放在 COPYgo.mod和go.sum之后、COPY 源码之前,否则缓存失效重下全部依赖
Modules 是现代 Go 工程的基石,但它的行为高度依赖环境变量和当前路径。看似一键 go build,背后是 GOCACHE、GOMODCACHE、GOPROXY、GOOS/GOARCH 多层联动。任何一层没对齐,编译就可能静默失败或行为不一致。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










