环境与模块
安装与版本选择
从 https://go.dev/dl/ 获取官方构建。生产环境建议:
- 使用次新版本或当前稳定版之一,避免过旧版本缺少安全修复。
go version应显示与项目go指令(见下)兼容的工具链。
GOROOT 与 GOPATH
GOROOT:Go 安装根目录,内含标准库与编译器;一般不必手动设置。GOPATH(模块时代仍保留):默认可为~/go,作为go install生成二进制默认安装路径等用途;业务代码不必须放在GOPATH/src下。
模块模式下,项目可在任意路径,只要存在 go.mod。
模块(go.mod)
模块是一组带共同版本前缀的包,根目录的 go.mod 声明模块路径与依赖。
go
module example.com/myapp
go 1.22
require (
golang.org/x/sync v0.7.0
)
go 1.xx行:指定该模块使用的最低 Go 语言版本(及对应工具链行为),不是「只能用该版本编译」;较新工具链仍可编译,但会按此行启用/禁用部分语言特性检查。require:直接依赖及其语义版本(SemVer tag)。
go.sum
记录依赖模块内容的加密校验和,应提交到版本库。go mod tidy 会整理 require 并更新 go.sum。
常用命令
| 命令 | 作用 |
|---|---|
go mod init <path> | 在当前目录创建 go.mod |
go mod tidy | 删未用依赖、补缺失依赖 |
go get pkg@version | 升级/降级某依赖并写回 go.mod |
go list -m all | 列出解析后的所有模块版本 |
代理与校验
GOPROXY:如https://proxy.golang.org,direct,加速与镜像拉取。GOSUMDB:默认sum.golang.org,校验模块与go.sum一致性。
工作区(go.work,可选)
多模块同仓协作时,可在仓库根放置 go.work,用 use 指向若干子模块目录,本地开发时统一解析,不必把 go.work 提交(团队策略可约定)。
包路径与导入
- 导入路径字符串在源码中唯一标识包,如
fmt、example.com/myapp/internal/foo。 - 同模块内:导入路径以
go.mod里module行 + 子目录为前缀。 internal目录规则:路径含/internal/的包只能被以internal父目录为根的目录树内的代码导入,用于封装实现细节。
go build / go run / go test
go build ./...:编译当前模块下所有包,默认不产生主包二进制到当前目录(主包需-o)。go run .:编译并运行当前目录主包。go test ./...:运行测试;-race打开数据竞争检测(性能下降明显,CI 中可选用)。
工具链指令(Go 1.21+)
go.mod 可写 toolchain go1.22.3,在本地 Go 较旧时会提示或自动获取匹配工具链(行为受 GOTOOLCHAIN 影响)。团队应在文档中约定是否启用自动升级,避免 CI 与本地不一致。