go install 不生效是因为默认输出到 $GOPATH/bin,而该路径未加入 PATH;需确认 $GOPATH/bin 已添加至 PATH,并区分 go install(写入 GOPATH/bin)与 go build(生成当前目录二进制)。

go mod init 后 go run 正常但 go install 不生效
这不是模块没配好,而是 go install 默认把二进制放进 $GOPATH/bin,而这个目录大概率不在你的 PATH 里。
- 运行
go env GOPATH查出实际路径(通常是$HOME/go),再确认$GOPATH/bin是否已加入PATH - macOS/Linux 用户检查
~/.zshrc或~/.bash_profile,追加:export PATH="$HOME/go/bin:$PATH" - Windows CMD 用户用:
set PATH=%PATH%;%GOPATH%\bin;PowerShell 用户用:$env:PATH += ";$env:GOPATH\bin" - 别混淆
go build和go install:前者生成当前目录下的可执行文件,后者才写入$GOPATH/bin - 想跳过
GOPATH直接安装到指定位置?设GOBIN=/your/custom/bin再跑go install .
国内拉不到私有模块或超时卡死
根本不是网络慢,是 GOPROXY 和 GO111MODULE 没配对。只设代理不启用模块模式,go mod tidy 会退回到旧的 GOPATH 模式,直接忽略代理。
- 强制开启模块:
go env -w GO111MODULE=on(Go 1.16+ 默认开,但旧 shell 配置可能关了它) - 代理必须带
direct后缀:go env -w GOPROXY=https://goproxy.cn,direct,漏掉,direct会导致私有域名模块拉取失败 - 公司内网 Git 域名(如
git.internal)必须加进GOPRIVATE:go env -w GOPRIVATE=git.internal,否则仍走代理被拦截 - 验证是否生效:运行
go env | grep -E "(GOPROXY|GO111MODULE|GOPRIVATE)",三者都应有值且无空行
viper 加载 config.prod.yaml 却读不到 db.host
viper 不自动继承基础配置——它不会“合并”两个文件,而是按加载顺序覆盖字段。如果 config.prod.yaml 里只写了 log_level,其他字段为空,那就是真为空。
- 正确做法:把通用字段(如
db.host、server.port)全写在config.yaml(无后缀)里,再为各环境建config.dev.yaml、config.prod.yaml,只覆盖差异项 - 加载时先
viper.SetConfigName("config"),再viper.AddConfigPath("."),最后viper.MergeConfigMap(map[string]interface{}{"env": "prod"})补全缺失字段 - 别依赖
viper.AutomaticEnv()+viper.SetEnvPrefix("APP")组合——它会让环境变量变成APP_DB_HOST,但代码里仍写viper.GetString("db.host"),结果读不到 - 调试技巧:加
viper.Debug()看最终解析出的完整配置树,一眼定位空字段来源
多项目共存时 gopls 报 no module found
VS Code 打开整个仓库顶层目录,gopls 就找不到单个项目的 go.mod——它只认当前工作区根目录下的模块,不递归扫描子目录。
立即学习“go语言免费学习笔记(深入)”;
- 不要用 “Open Folder” 打开
~/projects/这种父目录,而应为每个项目单独开一个窗口,根目录就是含go.mod的项目目录 - 若必须多项目协作,用 VS Code 的 Multi-root Workspace,并在
.code-workspace里显式指定每个根目录的go.toolsEnvVars,例如:"go.toolsEnvVars": {"GOROOT": "/usr/local/go", "GOPATH": "/home/user/go-private"} - 跨模块引用必须走
go work use ../other-module生成go.work,不能手动写replace other/module => ../other-module,否则gopls和go build行为不一致 - 查日志:命令面板输入
Go: Toggle Logs,看是否有no module found或invalid module path,基本就是go.work缺失或路径拼错
go env 输出可能被残留配置污染,go.work 文件可能丢失,viper 的加载顺序可能因新增配置文件而错乱——得养成每次新开终端后先跑 go env | grep -E "(GOROOT|GOPATH|GO111MODULE|GOPROXY)" 快速验一遍的习惯。


















