在 Ubuntu 上,Go 依赖的查找与存放位置取决于是否启用 Go Modules。现代项目一般使用 Go Modules,依赖由 go 命令自动下载到模块缓存,无需手动放置;传统 GOPATH 模式下,依赖放在工作区的 $GOPATH/src 目录并按导入路径分层存放。
一、快速判断与默认位置
- 启用 Go Modules(推荐,Go 1.11+):在项目根目录有 go.mod 文件时,运行 go build/run/get 会自动把依赖下载到模块缓存,并通过 GOPROXY 获取。常见下载源为 proxy.golang.org,国内可使用镜像如 GOPROXY=https://goproxy.cn,direct。依赖不会出现在 GOPATH/src 中。
- 未启用 Modules(GOPATH 模式):依赖按导入路径放在 $GOPATH/src 下,例如导入 github.com/gin-gonic/gin 时源码会在 $GOPATH/src/github.com/gin-gonic/gin。可通过 go env GOPATH 查看当前工作区路径。
二、常用查看与配置命令
- 查看 Go 环境:go env(关注 GOPATH、GOROOT、GO111MODULE、GOPROXY)
- 启用/关闭模块:go env -w GO111MODULE=on|off
- 设置国内代理(可选):go env -w GOPROXY=https://goproxy.cn,direct
- 在项目根目录初始化模块:go mod init
- 拉取/升级依赖:go get @;整理依赖:go mod tidy
- 查看下载的依赖放在哪:go list -m all(模块列表);模块缓存默认在 $GOPATH/pkg/mod(若 GOPATH 未设置,Go 会使用默认用户目录下的工作区)。
三、网络受限时的替代方案
- 使用国内 GOPROXY 镜像(如上),通常即可解决 golang.org/x/… 等包的拉取问题。
- 若必须手动获取 golang.org/x/ 相关包,可用官方 GitHub 镜像,例如:git clone https://github.com/golang/net.git $GOPATH/src/golang.org/x/net,保持与导入路径一致的目录结构后再构建。此方法适合临时绕过网络限制。
四、系统级依赖与 CGO 场景
- 纯 Go 依赖:由 go 命令管理,无需系统包管理器介入。
- CGO 依赖(调用 C 库):需安装系统库与编译工具,例如 gcc、make、pkg-config 及对应的 -dev 包。构建时报错如 /usr/bin/ld: cannot find -lxxx 时,先 locate 库文件,必要时在 /usr/lib 创建软链接并执行 ldconfig 更新缓存,再重新构建。