安装前需清理旧版Go(如/usr/bin/go或残留/usr/local/go),删除~/.zshrc等配置中旧行PATH,设新PATH="/usr/local/go/bin:$PATH";必配GOPROXY=https://goproxy.cn,direct;go install须指定精确版本如@v1.8.10;离线环境需提前go mod download预缓存依赖。

安装前先清理旧版本,避免PATH和GOROOT冲突
直接覆盖安装或残留旧版 go 会导致 which go 指向错误路径、go version 显示异常、甚至 go mod 报错“unknown revision”。CentOS 7 和 macOS 常见问题是系统自带的 /usr/bin/go(版本极老)与手动安装的 /usr/local/go/bin/go 同时存在。
- 执行
which go和ls -l $(which go)确认实际调用路径 - 彻底删除旧版:
sudo rm -rf /usr/local/go+rm -rf ~/go(即默认GOPATH) - 检查 shell 配置文件(
~/.zshrc、~/.bash_profile或 Windows 系统变量),删掉所有手动添加的export PATH=.../go/bin旧行 - 安装新包后只保留一条干净的
PATH:例如 macOS 上export PATH="/usr/local/go/bin:$PATH"
必须显式设 GOPROXY,且 direct 要放在末尾
不设代理时,go mod download 或 go get 会卡在 proxy.golang.org,超时后报 Get "https://proxy.golang.org/...": dial tcp: i/o timeout,而非明确提示“网络失败”——容易误判为模块本身问题。
- 正确写法(Linux/macOS):
export GOPROXY=https://goproxy.cn,https://goproxy.io,direct -
direct必须在逗号分隔列表末尾,否则像gitlab.internal.company这类私有域名也会走代理,触发 401 或 DNS 解析失败 - 验证是否生效:
go env GOPROXY输出应含goproxy.cn;再跑go list -m github.com/spf13/cobra@latest,响应应在 1–2 秒内 - Windows CMD 用户用
set GOPROXY=https://goproxy.cn,direct,PowerShell 用户用$env:GOPROXY="https://goproxy.cn,direct"
go install 必须带精确版本,别信 @latest
执行 go install github.com/swaggo/swag/cmd/swag@latest 可能拉到未发布的 master 分支,导致生成文档失败或 panic;而 go install swag@latest(没写路径)根本找不到命令。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 先查可用版本:
go list -m -versions github.com/swaggo/swag - 安装指定版本:
go install github.com/swaggo/swag/cmd/swag@v1.8.10 - 含破折号的 tag(如
v2.0.0-alpha)必须加英文双引号:go install "github.com/xxx/cli@v2.0.0-alpha" - 确保
$GOBIN在PATH中,否则装完也找不到命令;可运行go env GOBIN确认路径,并检查该目录下是否有生成的二进制文件
离线或 CI 场景下,提前用 go mod download 预缓存
在无外网权限的生产服务器或 Air-Gapped CI 环境中,等 go build 时现场拉依赖必然失败。此时不能靠 GOPROXY,而要提前把整套依赖树下载到本地。
立即学习“go语言免费学习笔记(深入)”;
- 在有网机器上进入项目根目录,运行:
go mod download(会按go.mod下载全部依赖) - 缓存默认存于
$GOMODCACHE(通常是~/go/pkg/mod),可打包该目录供离线环境复用 - 若需完全隔离,搭私有代理(如
athens)并配置GOPROXY=http://your-athens:3000,比硬拷贝更易维护 - 注意:
go clean -modcache会清空所有已下载模块,离线场景慎用
go.sum 与远程索引不一致或 replace 规则污染校验逻辑——这时候调 proxy 没用,得查 go.mod 里有没有漏删的 // indirect 行或指向不存在本地路径的 replace。

















