Go包管理与Modules
包管理与 Go Modules
包(Package)
每个 Go 文件属于一个 package,同一目录下 package 名相同:
1 | // mathutil/add.go |
导入规则:
1 | import "fmt" // 标准库 |
大写开头的标识符可导出(public),小写为包内私有。
可见性
1 | type User struct { // 可导出 |
Go Modules
Go 1.11+ 官方依赖管理方案,以模块(module)为单位。
初始化
1 | go mod init github.com/yourname/myproject |
生成 go.mod:
1 | module github.com/yourname/myproject |
常用命令
1 | go mod tidy # 添加缺失依赖、删除未使用依赖 |
版本语义
Go Modules 遵循语义化版本(SemVer):v1.2.3
- 主版本 ≥ 2 时,import 路径需带版本后缀:
v2/module/v2
replace 与私有仓库
本地开发替换依赖:
1 | replace example.com/lib => ../lib |
私有 Git 仓库需配置 GOPRIVATE:
1 | go env -w GOPRIVATE=git.company.com,github.com/yourname/* |
项目布局参考
1 | myproject/ |
internal/:Go 编译器强制,外部模块无法 importcmd/:多个可执行文件的入口pkg/:可复用的公共库
init 函数
包加载时自动执行,用于注册驱动、初始化配置:
1 | func init() { |
一个包可有多个 init,同一文件内按定义顺序执行。
小结
- 大写导出、小写私有,用 package 组织代码
- Go Modules 管理依赖,
go mod tidy保持依赖整洁 - 推荐
cmd/+internal/项目结构 internal包保证实现细节不对外暴露