Go Modules 最佳实践 #
项目结构最佳实践 #
标准项目布局 #
text
myproject/
├── cmd/ # 主应用程序
│ ├── server/
│ │ └── main.go
│ └── cli/
│ └── main.go
├── internal/ # 私有应用代码
│ ├── service/
│ ├── repository/
│ └── config/
├── pkg/ # 公共库代码
│ ├── utils/
│ └── api/
├── api/ # API 定义
│ ├── openapi/
│ └── proto/
├── configs/ # 配置文件
├── scripts/ # 脚本文件
├── docs/ # 文档
├── go.mod
├── go.sum
├── Makefile
└── README.md
简单项目布局 #
text
simple-app/
├── main.go
├── handler.go
├── service.go
├── go.mod
├── go.sum
└── README.md
库项目布局 #
text
mylib/
├── go.mod
├── go.sum
├── doc.go # 包文档
├── lib.go # 主入口
├── lib_test.go # 测试
├── internal/ # 内部实现
│ └── helper.go
├── examples/ # 示例
│ └── basic/
│ └── main.go
└── README.md
go.mod 管理最佳实践 #
模块命名 #
go
// ✅ 推荐:使用仓库路径
module github.com/myuser/myproject
// ✅ 推荐:使用组织路径
module github.com/myorg/myproject
// ✅ 推荐:私有仓库
module gitlab.company.com/team/project
// ❌ 不推荐:简单名称(仅本地开发可用)
module myproject
版本声明 #
go
module github.com/myuser/myproject
// ✅ 推荐:声明主要 Go 版本
go 1.21
// ❌ 不推荐:过于精确
go 1.21.3
// ❌ 不推荐:过时版本
go 1.16
依赖组织 #
go
module github.com/myuser/myproject
go 1.21
// ✅ 推荐:按类型分组,按字母排序
require (
// Web 框架
github.com/gin-gonic/gin v1.9.1
// 数据库
github.com/jackc/pgx/v5 v5.5.0
github.com/redis/go-redis/v9 v9.3.0
// 工具库
github.com/google/uuid v1.5.0
)
// ✅ 间接依赖自动管理
require (
github.com/bytedance/sonic v1.9.1 // indirect
)
依赖管理最佳实践 #
添加依赖 #
bash
# ✅ 推荐:指定版本
go get github.com/gin-gonic/gin@v1.9.1
# ✅ 推荐:使用 latest(开发阶段)
go get github.com/gin-gonic/gin@latest
# ❌ 不推荐:不指定版本
go get github.com/gin-gonic/gin
# ✅ 推荐:添加后整理
go get github.com/gin-gonic/gin@v1.9.1
go mod tidy
更新依赖 #
bash
# ✅ 推荐:定期更新,分批进行
go get -u=patch # 只更新补丁版本
go mod tidy
go test ./...
# ✅ 推荐:更新单个依赖
go get github.com/gin-gonic/gin@latest
go mod tidy
go test ./...
# ⚠️ 谨慎:更新所有依赖
go get -u
go mod tidy
go test ./...
移除依赖 #
bash
# ✅ 推荐:使用 tidy 自动清理
go mod tidy
# ❌ 不推荐:手动编辑 go.mod 后不运行 tidy
依赖选择原则 #
text
选择依赖时考虑:
1. 活跃度
├── 最近更新时间
├── Issue 处理速度
└── 社区活跃度
2. 稳定性
├── 版本号 >= v1.0.0
├── API 稳定性
└── 向后兼容性
3. 质量
├── 测试覆盖率
├── 文档完整性
└── 代码质量
4. 依赖数量
├── 传递依赖少
├── 无重复功能依赖
└── 依赖树清晰
5. 许可证
├── 兼容项目许可
├── 无法律风险
└── 明确的许可证
版本控制最佳实践 #
版本号选择 #
bash
# 开发阶段
v0.x.x # 快速迭代,API 不稳定
# 正式发布
v1.0.0 # API 稳定
# 功能更新
v1.1.0 # 新增功能
# Bug 修复
v1.1.1 # 修复 Bug
# 重大变更
v2.0.0 # 不兼容变更
发布流程 #
bash
# 1. 准备发布
go mod tidy
go test ./...
go vet ./...
# 2. 更新 CHANGELOG
# 编辑 CHANGELOG.md
# 3. 提交代码
git add .
git commit -m "release v1.0.0"
# 4. 打标签
git tag -a v1.0.0 -m "Release v1.0.0"
# 5. 推送
git push origin main
git push origin v1.0.0
# 6. 验证
go list -m -versions github.com/myuser/mylib
CHANGELOG 维护 #
markdown
# Changelog
All notable changes to this project will be documented in this file.
## [Unreleased]
### Added
- New feature A
## [1.1.0] - 2024-01-15
### Added
- Feature B
- Feature C
### Changed
- Improved performance of X
### Fixed
- Bug #123
### Security
- Fixed CVE-2024-1234
## [1.0.0] - 2024-01-01
### Added
- Initial release
团队协作最佳实践 #
统一环境配置 #
bash
# 项目根目录创建 .envrc 或脚本
# setup.sh
#!/bin/bash
# 配置 Go 版本
go version
# 配置代理
go env -w GOPROXY=https://goproxy.cn,direct
# 配置私有模块
go env -w GOPRIVATE=github.com/mycompany/*
# 下载依赖
go mod download
echo "Environment setup complete!"
.gitignore 配置 #
gitignore
# Binaries
*.exe
*.exe~
*.dll
*.so
*.dylib
# Test binary
*.test
# Output
/bin/
/dist/
# Go workspace
go.work
go.work.sum
# IDE
.idea/
.vscode/
*.swp
*.swo
# OS
.DS_Store
Thumbs.db
# Environment
.env
.env.local
*.env
# Logs
*.log
logs/
代码审查检查点 #
markdown
## 依赖变更审查
- [ ] 新依赖是否必要?
- [ ] 版本选择是否合理?
- [ ] 是否有安全风险?
- [ ] 许可证是否兼容?
- [ ] go.mod 格式是否正确?
- [ ] go.sum 是否更新?
- [ ] 是否运行了 go mod tidy?
- [ ] 测试是否通过?
CI/CD 配置 #
yaml
# .github/workflows/ci.yml
name: CI
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: '1.21'
- run: go vet ./...
- uses: golangci/golangci-lint-action@v3
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: '1.21'
cache: true
- run: go mod download
- run: go mod verify
- run: go test -v -race -coverprofile=coverage.out ./...
- uses: codecov/codecov-action@v3
build:
runs-on: ubuntu-latest
needs: [lint, test]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: '1.21'
- run: go build -v ./...
安全最佳实践 #
依赖安全检查 #
bash
# 使用 govulncheck
go install golang.org/x/vuln/cmd/govulncheck@latest
govulncheck ./...
# 使用 nancy
go list -json -m all | nancy sleuth
# 使用 trivy
trivy fs .
定期更新依赖 #
bash
# 每月检查更新
go list -u -m all
# 更新有安全问题的依赖
go get -u=patch
go mod tidy
# 验证更新
go test ./...
govulncheck ./...
私有模块安全 #
bash
# 配置私有模块
go env -w GOPRIVATE=github.com/mycompany/*
# 使用 SSH 认证
git config --global url."git@github.com:".insteadOf "https://github.com/"
# 使用 token 认证
# ~/.netrc
machine github.com
login username
password ghp_xxxx
性能优化最佳实践 #
模块缓存优化 #
bash
# CI/CD 中缓存模块
# GitHub Actions
- name: Cache Go modules
uses: actions/cache@v3
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-go-
构建优化 #
bash
# 使用 vendor 加速构建
go mod vendor
go build -mod=vendor
# 并行构建
go build -p 4 ./...
# 减小二进制大小
go build -ldflags="-s -w" -o app
代理优化 #
bash
# 使用国内代理
go env -w GOPROXY=https://goproxy.cn,direct
# 使用多代理
go env -w GOPROXY=https://goproxy.cn,https://proxy.golang.org,direct
# 企业代理
go env -w GOPROXY=http://proxy.company.com,direct
文档最佳实践 #
README 模板 #
markdown
# Project Name
Brief description of the project.
## Installation
```bash
go get github.com/myuser/myproject
Quick Start #
go
package main
import "github.com/myuser/myproject"
func main() {
myproject.Run()
}
Documentation #
Requirements #
- Go 1.21+
License #
MIT
text
### 包文档
```go
// Package mylib provides utilities for doing something.
//
// The mylib package provides a simple way to do something.
// It is designed to be easy to use and efficient.
//
// Example:
//
// package main
//
// import "github.com/myuser/mylib"
//
// func main() {
// result := mylib.DoSomething()
// fmt.Println(result)
// }
package mylib
常见错误避免 #
错误一:忘记 go mod tidy #
bash
# ❌ 错误
# 直接提交代码,不运行 tidy
# ✅ 正确
go mod tidy
git add go.mod go.sum
git commit -m "update dependencies"
错误二:不提交 go.sum #
bash
# ❌ 错误
# .gitignore 中忽略 go.sum
# ✅ 正确
git add go.mod go.sum
git commit -m "update dependencies"
错误三:使用过时依赖 #
bash
# ❌ 错误
# 长期不更新依赖
# ✅ 正确
# 定期检查更新
go list -u -m all
go get -u=patch
错误四:版本号不规范 #
bash
# ❌ 错误
git tag 1.0.0 # 缺少 v 前缀
# ✅ 正确
git tag v1.0.0
错误五:主版本路径错误 #
go
// ❌ 错误:v2 没有修改导入路径
module github.com/myuser/mylib // v2.0.0
// ✅ 正确:v2 修改导入路径
module github.com/myuser/mylib/v2 // v2.0.0
检查清单 #
项目初始化 #
markdown
- [ ] 创建 go.mod
- [ ] 配置 GOPROXY
- [ ] 配置 GOPRIVATE(如需要)
- [ ] 创建 .gitignore
- [ ] 创建 README.md
日常开发 #
markdown
- [ ] 定期运行 go mod tidy
- [ ] 提交 go.mod 和 go.sum
- [ ] 定期更新依赖
- [ ] 运行安全检查
发布前 #
markdown
- [ ] go mod tidy
- [ ] go mod verify
- [ ] go test ./...
- [ ] go vet ./...
- [ ] govulncheck ./...
- [ ] 更新 CHANGELOG
- [ ] 打正确格式的标签
下一步 #
继续深入学习:
最后更新:2026-03-28