Windows 10 上用 PowerShell + Chocolatey 搭 Go 环境必须显式初始化 GOPATH、校验 go.exe 签名、绕过默认执行策略,否则 go env -w 设置静默失效,go mod init 报“cannot find main module”;需改 PowerShell 执行策略为 RemoteSigned、手动创建 GOPATH 目录结构、排除 Windows Defender 误杀,并在英文路径下显式指定 module 名初始化。

Windows 10 上用 PowerShell + Chocolatey 搭 Go 环境,不是“装完就能跑”,而是必须显式初始化 GOPATH、校验 go.exe 签名、绕过默认执行策略——否则 go env -w 设置会静默失效,go mod init 报 go: cannot find main module 是大概率事件。
PowerShell 执行策略不改,go env -w 就白设
Chocolatey 安装的 Go 二进制本身没问题,但 PowerShell 默认策略(Restricted)会阻止 profile 脚本加载,导致你手动执行的 go env -w GOPATH=... 只在当前会话生效,新开窗口就丢。这不是 Go 的 bug,是 PowerShell 的加载机制在作祟。
- 先查当前策略:
Get-ExecutionPolicy -Scope CurrentUser,如果不是RemoteSigned或AllSigned,就得改 - 运行:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser(无需管理员权限) - 改完重启 PowerShell,再验证:
go env GOPATH应该返回你设的路径,不是空或默认值
GOPATH 目录结构不手建,go get 会失败
Chocolatey 安装 Go 后不会自动创建 $GOPATH/src、$GOPATH/bin、$GOPATH/pkg 这三层目录。而 go get(尤其老项目依赖)仍会尝试往 src 下写代码,GOBIN 也默认指向 $GOPATH/bin —— 如果目录不存在,命令直接报错或静默跳过。
- 别依赖“默认存在”,执行:
mkdir -p $HOME\go\src, $HOME\go\bin, $HOME\go\pkg - 确认
GOBIN指向正确:go env -w GOBIN=$HOME\go\bin - 把
$HOME\go\bin加进PATH:$env:Path += ";$HOME\go\bin"(加到 profile 里才持久)
Windows Defender 误杀 go.exe 导致 go version 崩溃
某些 Windows 10/11 版本(尤其是 LTSC 或企业版)的 Defender 实时防护,会对 Chocolatey 下载的 go.exe 触发“可疑行为”拦截,表现为命令行卡住、无输出、或直接退出——不是崩溃日志,也没有错误提示,就是没反应。
立即学习“go语言免费学习笔记(深入)”;
- 临时关闭 Defender 实时防护(仅测试用):
Set-MpPreference -DisableRealtimeMonitoring $true - 更稳妥做法:把
C:\Program Files\Go\bin加进排除列表:Add-MpPreference -ExclusionPath "C:\Program Files\Go\bin" - 验证是否生效:开新 PowerShell,直接运行
go.exe(不带参数),应输出帮助文本而非卡死
go mod init 报 cannot find main module 的真实原因
这个错误和 GOPATH 关系不大,而是模块根目录缺失 go.mod 文件且当前路径不在任何已知模块内。PowerShell 中容易忽略两点:一是路径含空格或中文,二是当前目录没被识别为 Git 工作区(go mod init 会尝试从 Git remote URL 推导 module path)。
- 确保在英文路径下操作,比如:
cd C:\dev\hello-go,而不是C:\用户\张三\go项目 - 初始化时显式指定 module 名:
go mod init example.com/hello-go,别只敲go mod init - 如果项目已有 Git 仓库,先
git init再go mod init,避免它瞎猜路径
最常被跳过的其实是 go.exe 签名校验和 PowerShell profile 初始化顺序——前者让环境看似正常实则随时中断,后者让所有 go env -w 设置形同虚设。这两步不做,后面调 VS Code 调试器、跑 go test 都可能突然失灵。


















