结论:GOROOT必须显式配置,GOPATH在Go 1.16+可不设(默认生效),但GO111MODULE=on和GOPROXY必须配置,否则go mod download或go run极易卡住;VS Code中还需确保"go.useLanguageServer": true且gopls正确安装。

直接说结论:个人开发机上搭 Go 环境,GOROOT 必须显式配置,GOPATH 在 Go 1.16+ 可以不设(默认生效),但 GO111MODULE=on 和 GOPROXY 这两项不配,十有八九会卡在 go mod download 或 go run 启动阶段。
GOROOT 和 GOPATH 到底要不要手动设?
要设 GOROOT,可不设 GOPATH —— 但得知道为什么。
-
GOROOT是 Go 安装根目录,比如/usr/local/go(Linux/macOS)或C:\Go(Windows)。不设它,go命令可能找不到自身工具链(尤其当你用 tar.gz 手动解压安装时) -
GOPATH默认是$HOME/go(Linux/macOS)或%USERPROFILE%\go(Windows)。Go 1.11+ 开启 module 模式后,它只影响go get无 module 的旧包时的存放位置;新项目完全走go.mod,跟GOPATH/src无关 - 常见错误现象:
go: cannot find main module或go: no modules found,往往不是GOPATH没设,而是当前目录没go.mod或没执行go mod init
GO111MODULE=on 和 GOPROXY 必须配,否则寸步难行
国内网络环境下,这两项不配,go mod tidy 会卡住、超时,甚至报 proxy.golang.org: i/o timeout。
- 执行这两条命令即可生效(永久写入环境变量):
go env -w GO111MODULE=ongo env -w GOPROXY=https://goproxy.cn,direct -
GO111MODULE=on强制启用 module 模式,避免自动 fallback 到GOPATH模式导致依赖混乱 -
GOPROXY=https://goproxy.cn,direct中的direct表示:若代理无法提供某模块,就直连原始仓库(比如私有 GitLab),而不是彻底失败 - 验证是否生效:
go env | grep -E "(GO111MODULE|GOPROXY)",输出应为GO111MODULE="on"和GOPROXY="https://goproxy.cn,direct"
VS Code + gopls 配置最容易漏掉的三件事
装了插件却没智能提示、跳转失效、保存不自动格式化?大概率是这三项没调对。
立即学习“go语言免费学习笔记(深入)”;
- 确保 VS Code 已安装官方
Go插件(由 Go team 维护,IDgolang.go),不是第三方“Go Extension Pack”之类的老插件 - 检查设置里
"go.useLanguageServer": true是否开启 ——gopls是唯一被官方推荐的语言服务器,gocode等已弃用 - 如果
gopls启动失败,常因GOROOT或PATH不对:在 VS Code 终端里运行which go和go env GOROOT,确认输出路径与系统一致;必要时在 VS Code 设置中指定"go.goroot": "/usr/local/go"
Mac M1/M2 或 Windows WSL 下的特殊路径陷阱
ARM 架构和子系统环境容易让 go 找错二进制,尤其当你混用 Homebrew、pkg 和 tar.gz 安装方式时。
- Mac Apple Silicon(M1/M2)必须下载
arm64版本,不能用amd64—— 否则go version可能报cannot execute binary file: Exec format error - Windows WSL 用户:不要在 Windows 文件系统(
/mnt/c/...)下建 Go 项目。WSL 对 NTFS 的权限和符号链接支持不完整,go mod可能报permission denied或反复重写go.sum - Homebrew 安装的 Go(
brew install go)默认路径是/opt/homebrew/bin/go(M1/M2)或/usr/local/bin/go(Intel),此时GOROOT应设为/opt/homebrew/opt/go/libexec(M1/M2)或/usr/local/opt/go/libexec(Intel),而非/usr/local/go
最常被忽略的其实是 GOBIN —— 如果你习惯用 go install 装工具(比如 gopls、gotip),不设 GOBIN 就会把二进制丢进 $GOPATH/bin,而该目录未必在 PATH 里,结果命令找不到。


















