GOROOT和GOPATH必须严格分离:GOROOT=/usr/local/go(仅官方SDK),GOPATH=$HOME/go(用户工作区),混用会污染工具链;Go Modules需显式启用并配置国内代理,工具安装须带@latest后缀,VS Code自动更新应禁用。

GOROOT 和 GOPATH 不要混用,尤其别把 GOPATH 设成 /usr/local/go
很多人图省事,在 Linux 上解压 Go 到 /usr/local/go 后,顺手把 GOPATH 也设成同一路径。这会导致 go install 把编译好的二进制直接塞进 Go 安装目录,污染工具链——下次升级 Go 版本时,rm -rf /usr/local/go 就会连带删掉你所有自建工具。
正确做法是严格分离:
-
GOROOT=/usr/local/go(只放官方二进制和标准库) -
GOPATH=$HOME/go(用户专属工作区,含src、pkg、bin) -
PATH中只加$GOROOT/bin和$GOPATH/bin,不加$GOPATH本身
Go Modules 必须显式启用并配代理,否则依赖拉取失败是常态
Go 1.16+ 虽默认开启模块模式,但若本地 GO111MODULE 被意外覆盖为 off,或网络无法直连 proxy.golang.org,go mod download 就会卡住或报错 no required module provides package。
执行这两条命令保底:
立即学习“go语言免费学习笔记(深入)”;
go env -w GO111MODULE=on-
go env -w GOPROXY=https://goproxy.cn,direct(国内推荐;企业内网可换为私有 Artifactory 地址)
验证方式:go env GO111MODULE GOPROXY 输出应为 on 和你设置的地址,不是空或 https://proxy.golang.org。
开发工具链要用 @latest 显式安装,避免版本漂移失控
像 gopls、dlv、staticcheck 这类工具,如果只运行 go install golang.org/x/tools/gopls(不带 @latest),Go 会按当前模块的 go.mod 版本解析依赖,极易装出过旧或不兼容的版本。
统一用带版本后缀的方式安装:
go install golang.org/x/tools/gopls@latestgo install github.com/go-delve/delve/cmd/dlv@latestgo install honnef.co/go/tools/cmd/staticcheck@latest
装完检查:gopls version 应输出类似 v0.15.2 的语义化版本号,而不是 (devel) 或空白。
VS Code 的 go.toolsManagement.autoUpdate 必须关掉
VS Code 的 Go 扩展默认开启自动更新工具,看似省心,实则危险:某天它可能静默把 gopls 升级到尚不稳定的新版,导致 IDE 卡死、跳转失效、诊断延迟——而你根本不知道发生了什么。
在 VS Code 的 settings.json 中明确禁用:
{"go.toolsManagement.autoUpdate": false}
后续升级工具全靠手动触发 Ctrl+Shift+P → Go: Install/Update Tools,并勾选需要更新的项。这样每次变更都可控,出问题也能快速回滚。
长期开发最易被忽略的其实是环境变量的“隐式继承”:比如在 tmux 里启动 shell,或通过 systemd 用户服务启 IDE,它们未必加载你的 .bashrc。务必用 go env 在实际开发终端里验证,而不是只在纯 shell 中测。


















