powershell执行策略restrict导致go env -w设置不生效,需运行set-executionpolicy remotesigned -scope currentuser;chocolatey装go后需手动创建gopath\src并执行go mod init;goroot通常无需手动设,gobin建议设为$gopath\bin并加入path。

go version 和 go env -w 写入的变量不生效?检查 PowerShell 执行策略
PowerShell 默认执行策略是 Restricted,它会阻止 profile 脚本加载,导致你用 go env -w GOPATH=C:\Users\me\go 写入的设置在新窗口里完全不生效——go env GOPATH 仍返回空或默认值。
这不是 Go 的 bug,而是 PowerShell 的安全机制在起作用。解决方法很简单:
- 以管理员身份打开 PowerShell,运行:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser - 关闭并重开 PowerShell,再执行
go env -w GOPATH=C:\Users\me\go - 验证:
go env GOPATH应该立刻输出你刚设的路径
注意:别用 Unrestricted,RemoteSigned 已足够且更安全;如果公司策略禁用该策略,就改用手动修改 $PROFILE 文件,在末尾追加 $env:GOPATH="C:\Users\me\go" 并重启。
Chocolatey 安装 Go 后,为什么 go run 仍报错 “cannot find main module”?
Chocolatey 只装了 go.exe,但不会初始化模块环境,也不会创建 GOPATH\src 目录结构,更不会帮你设置 GOBIN。遇到这个错误,说明你当前目录不在一个 Go 模块内,且没设 GOPATH 或它下面没有 src 子目录。
快速修复步骤:
- 手动创建目录:
mkdir C:\Users\me\go\src - 确保
GOPATH已通过go env -w正确写入(见上一条) - 进入
C:\Users\me\go\src\hello,运行go mod init hello - 再写
hello.go,就能用go run hello.go成功运行
别跳过 go mod init —— 即使只是写个 demo,现代 Go(1.16+)也默认启用模块模式,不初始化就找不到包根。
GOROOT 和 GOBIN 到底要不要手动设?
绝大多数情况下,GOROOT 不需要手动设。Chocolatey 或官方安装包会把它写进注册表或系统 PATH,go env GOROOT 能自动识别。强行用 go env -w GOROOT=... 反而容易出错,比如指向一个没 bin 子目录的路径,导致 go build 找不到 go.exe 自身。
GOBIN 倒是建议明确设置:
- 设成
C:\Users\me\go\bin(和GOPATH保持同级) - 然后把该路径加进系统
PATH(不是用户 PATH,避免某些工具链读不到) - 这样你用
go install装的 CLI 工具(比如gopls、stringer)才能全局调用
Windows Defender 有时会误杀刚生成的 go 工具二进制,首次 go install 失败时,先去安全中心“恢复受限制的应用”,再重试。
VS Code 调试器启动失败,launch.json 怎么配才不踩坑?
常见现象是点击调试按钮后卡住,或报错 exec format error。根本原因往往是 launch.json 里用了旧式 program 字段指向 .go 文件,但 Go 扩展新版默认要求用 mode: "test" 或 mode: "auto" 配合 request: "launch"。
一个可靠配置示例(适用于 main 包):
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch Package",
"type": "go",
"request": "launch",
"mode": "test",
"program": "${workspaceFolder}",
"env": {},
"args": []
}
]
}
关键点:
-
program必须是目录路径(如${workspaceFolder}),不是文件名 -
mode: "test"兼容性最好;若项目含main函数且想直接运行,也可用mode: "exec",但必须先go build出二进制,并把program指向那个文件 - 别依赖自动生成的配置——VS Code Go 扩展 v0.38+ 后,很多模板已过时
最易被忽略的是:Go 扩展必须启用,且不能和其他语言的调试器插件冲突;禁用所有非必要插件后重试,往往立刻见效。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











