windows 10 上用 powershell + chocolatey 搭 go 环境需设 powershell 执行策略为 remotesigned、手动创建 gopath 目录结构并用 go env -w 固定路径、将 %userprofile%\go 加入 windows defender 排除列表,否则易遇 cannot find main module 或静默失败。

Windows 10 上用 PowerShell + Chocolatey 搭 Go 环境,只要跳过执行策略和 GOPATH 初始化这两个坑,基本不会卡在 go: cannot find main module 或 GOPATH not set 上。
PowerShell 执行策略必须设为 RemoteSigned
Chocolatey 安装后首次调用 choco install golang 会失败,错误不是“找不到命令”,而是脚本被系统静默拦截——因为默认策略是 Restricted。这不是权限问题,是 PowerShell 的安全机制在起作用。
- 先以管理员身份打开 PowerShell,运行:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser - 别用
-Scope LocalMachine,它需要管理员权限且可能被 Windows Defender 重置 - 验证是否生效:运行
Get-ExecutionPolicy -List,确认CurrentUser行显示RemoteSigned - 这步不做,后续所有
go env -w设置都会看似成功、实则不持久
Go 1.21+ 必须显式初始化 GOPATH 目录结构
官方文档说 “Go Modules 模式下 GOPATH 不再强制要求”,但 Windows 10 上 VS Code、go test、甚至 go run 在某些路径下仍会回退查找 %USERPROFILE%\go\src。不提前建好,就会触发 cannot find main module 报错。
- 手动创建目录:
mkdir %USERPROFILE%\go\src %USERPROFILE%\go\bin %USERPROFILE%\go\pkg - 用
go env -w GOPATH=%USERPROFILE%\go固定路径(注意用反斜杠或双反斜杠) - 别依赖 Chocolatey 自动创建 —— 它只装二进制,不建目录树,也不写入 profile
- 如果已用
go mod init初始化过项目,删掉项目根目录下的go.mod和go.sum再试,避免缓存干扰
go env -w 设置在 PowerShell 中容易失效的三个原因
go env -w GOBIN=%USERPROFILE%\go\bin 看似执行成功,但新开一个 PowerShell 窗口就失效,本质是环境变量没写进用户配置文件。
- Chocolatey 安装的 Go 不会自动修改
$PROFILE,得自己追加:"$env:GOBIN=$env:USERPROFILE\go\bin" | Out-File -Append $PROFILE - PATH 要同步加进去:
"$env:PATH += ';'+$env:GOBIN" | Out-File -Append $PROFILE - 每次改完
$PROFILE后,必须运行. $PROFILE重载,不能只关掉再开新窗口(profile 可能未加载) - 用
go env GOPATH和go env GOBIN验证,而不是只看echo $env:GOPATH—— Go 工具链读的是它自己解析后的值
Windows Defender 会误杀 go.exe 导致构建失败
尤其在 LTSC 或刚重装系统的机器上,go build 突然卡住、无输出、进程消失,大概率是 Windows Defender 把 go.exe 或临时生成的 .exe 当成可疑程序干掉了。
- 检查事件查看器 → Windows 日志 → 安全,筛选 ID 1116(防病毒软件阻止了进程)
- 临时禁用实时保护(仅测试用):
Set-MpPreference -DisableRealtimeMonitoring $true - 更稳妥的做法:把
%USERPROFILE%\go加入排除路径:Add-MpPreference -ExclusionPath "%USERPROFILE%\go" - 别跳过这步 —— 这个问题不会报错,只会让
go run像死了一样没反应
真正卡住人的从来不是安装命令本身,而是 PowerShell 的 profile 加载顺序、Windows Defender 的静默拦截、以及 Go 工具链对目录结构的隐式依赖 —— 这三处不手动干预,自动化脚本跑十次有八次会掉链子。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











