goland中goproxy必须通过go env -w设置系统级环境变量,ide设置框仅为提示;需同时配置goprivate跳过私有模块代理,并用godebug=goproxylookup=1验证请求地址。

GoLand里改GOPROXY必须用go env -w,不是改IDE设置框
GoLand 的 Settings → Go → Go Modules 里的 GOPROXY 输入框只是个“提示字段”,它不参与实际代理路由。真正生效的是系统级环境变量 GOPROXY。你在 IDE 设置里填了 https://goproxy.cn,direct,但终端里 go env GOPROXY 还是空或默认值,那所有 go mod 命令都走不了代理。
正确做法是在终端执行:
go env -w GOPROXY=https://goproxy.cn,https://mirrors.aliyun.com/goproxy/,direct
然后重启 GoLand(或重载项目),让它读取新的环境变量。验证方式是打开 Terminal 面板运行 go env GOPROXY,确认输出和你设置的一致。
- 多个镜像必须用英文逗号分隔,不能有空格
-
direct必须小写、必须在末尾,否则私有模块会失败 - GoLand 启动时只读取一次环境变量,改完不重启 IDE 就不会生效
私有模块路径没加GOPRIVATE,代理会把请求发错地方
如果你的项目 import 了 git.corp/internal/pkg 这类内网路径,但没设 GOPRIVATE,Go 会照常把请求发给 goproxy.cn——而镜像服务根本不知道这个域名,直接返回 404 或超时。
解决方法是显式声明私有前缀:
go env -w GOPRIVATE=git.corp/*
这样 Go 就知道:凡是匹配 git.corp/* 的 module path,一律跳过 GOPROXY,改用本地 git 命令直连拉取。
- 支持通配符,
git.corp/*比git.corp更安全(避免漏掉子路径) - 如果用了多个私有域名,用逗号分隔:
git.corp/*,github.com/my-org/private -
GOPRIVATE和GONOSUMDB常一起用,后者解决 checksum 校验失败问题
GoLand Terminal 里 go list -m all 不打印请求地址?加 GODEBUG 看真实行为
很多人在 GoLand Terminal 执行 go list -m all,发现没输出任何 URL,就以为代理没生效。其实 Go 默认不打印网络请求细节,得手动开启调试。
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
临时启用请求日志:
GODEBUG=goproxylookup=1 go list -m all
你会看到类似这样的输出:
goproxylookup: using https://goproxy.cn/github.com/spf13/cobra/@v/v1.40.0.info
这才是真实发出的请求地址。如果这里还是 proxy.golang.org 或压根没日志,说明 GOPROXY 没被正确加载。
- 这个调试开关只影响当前命令,不影响构建或运行
- 不要依赖 IDE 的 “Build” 按钮输出来判断代理是否工作,它默认不显示网络层信息
- CI 流水线中建议固定用
GODEBUG=goproxylookup=1 go mod download -x做验证
GoLand 提示“未定义 GOROOT”时,GOPROXY 设置可能也失效
GOROOT 和 GOPROXY 是两个独立配置,但 GoLand 在 GOROOT 未识别成功时,会降级使用内置的 Go 工具链(可能版本老旧),而旧版 Go 对 GOPROXY 解析逻辑不同,甚至忽略多镜像 fallback。
先确认 GOROOT 正确:
go env GOROOT
输出应是你本地 Go 安装路径(如 /usr/local/go 或 C:\Go)。如果不是,GoLand 的 Settings → Go → GOROOT 里要手动指定同一路径。
- GOROOT 错误会导致 go.mod 解析异常,进而让代理配置“看起来生效实则被绕过”
- 某些 GoLand 版本在 GOROOT 为空时会静默回退到 Go 1.16 行为,而该版本对
directfallback 支持不完整 - 改完 GOROOT 后务必点击右下角 “Reload project” 按钮,否则 go.mod 不会重新解析
go env 看变量 → GODEBUG=... go list 看请求 → 再检查 IDE 是否用了同一套 Go 环境。










