go install 用于构建并安装可执行命令到 $GOBIN,不修改 go.mod;go get 仅更新 go.mod 并下载依赖,Go 1.17+ 后不再安装 CLI 工具。

Go 1.17+ 默认关闭 GO111MODULE=off,go get 不再安装可执行命令,只修改 go.mod 并下载依赖;真正安装 CLI 工具必须用 go install。很多人执行 go get github.com/cosmtrek/air@latest 后发现 air 命令找不到,就是混淆了这两个命令。
go get :仅添加/更新 require 条目到 go.mod,下载源码到 $GOPATH/pkg/mod
go install @version :构建并复制二进制到 $GOBIN(默认为 $GOPATH/bin),不修改当前模块的 go.mod
$GOBIN,确保 $GOPATH/bin 在 $PATH 中,否则安装后命令不可用直接 go get -u 会升级所有间接依赖,极易引发兼容性问题。应始终明确指定包路径和版本约束。
go get example.com/lib@latest
go get example.com/lib@v1.12.0
go list -m -versions example.com/lib
go test ./...,尤其检查 TestMain 或集成测试是否因接口变更失败go get 和 go mod tidy 配合才能真正清理。单独删 go.mod 里的 require 行无效,且可能残留 go.sum 签名。
go.mod 中对应 require 行(或用编辑器搜索删除)go mod tidy:自动删掉未引用的依赖、补全缺失项、同步 go.sum
xxx is not used 但仍在 go.mod 中,说明有隐式 import(如嵌套在 _test.go 或 build tag 条件代码中),需全局 grep 源码确认go list -m all | grep xxx 验证是否已消失Go 1.18+ 仍依赖 $GOBIN 存放 go install 生成的二进制,但 $GOPATH 仅用于存放模块缓存(pkg/mod)和旧式非 module 项目。两者路径冲突或权限错误会导致“command not found”或“permission denied”。
export GOBIN=$HOME/go/bin export PATH=$GOBIN:$PATH
$GOBIN 设为系统目录(如 /usr/local/bin),否则 go install 可能因权限失败go clean -modcache 可清空全部下载的包,但会强制后续构建重新下载——适合解决校验失败或磁盘占满时的手动干预go install/go get 分工和 GOBIN 路径行为的基础上。漏掉任一环,就容易出现“装了却用不了”“删了还报错”这类问题。