项目结构
标准项目结构
Go项目的标准目录结构。
myproject/
├── cmd/ # 主要的应用程序入口
│ └── myapp/
│ └── main.go # 应用程序入口点
├── internal/ # 私有应用程序和库代码
│ ├── auth/ # 认证相关代码
│ ├── config/ # 配置相关代码
│ └── models/ # 数据模型
├── pkg/ # 可以被外部应用程序使用的库代码
│ ├── api/ # API客户端
│ └── utils/ # 工具函数
├── api/ # API协议定义
│ ├── swagger/ # Swagger文档
│ └── proto/ # Protocol Buffers定义
├── web/ # Web应用程序特定的组件
│ ├── static/ # 静态资源
│ └── templates/ # 模板文件
├── configs/ # 配置文件模板或默认配置
├── test/ # 额外的外部测试应用程序和测试数据
├── docs/ # 设计和用户文档
├── examples/ # 应用程序和/或公共库的示例
├── tools/ # 项目的支持工具
├── go.mod # Go模块定义
├── go.sum # Go模块依赖校验
├── Makefile # 项目构建脚本
├── Dockerfile # 容器化配置
└── README.md # 项目说明文档
目录说明
各个目录的用途和最佳实践。
# cmd/
- 包含项目的主要应用程序
- 每个应用程序的目录名应该与可执行文件的名称相匹配
- 不应该包含太多代码,应该将代码导入到其他包中
# internal/
- 包含不希望被其他项目导入的私有应用程序代码
- 可以包含多个包
- 每个包都应该有明确的职责
# pkg/
- 包含可以被外部应用程序使用的库代码
- 其他项目可以安全地导入这些包
- 应该保持API的稳定性
# api/
- 包含API协议定义
- 可以包含OpenAPI/Swagger规范
- 可以包含Protocol Buffers定义
# web/
- 包含Web应用程序特定的组件
- 静态资源文件
- 模板文件
- 前端代码
# configs/
- 配置文件模板
- 默认配置文件
- 不同环境的配置
# test/
- 额外的外部测试应用程序
- 测试数据
- 测试工具
# docs/
- 设计和用户文档
- 架构图
- 开发指南
# examples/
- 应用程序的示例
- 库的使用示例
- 示例代码应该可以运行
# tools/
- 项目的支持工具
- 构建脚本
- 开发工具
包组织
Go包的组织原则和最佳实践。
# 包命名
- 使用小写字母
- 使用单个单词
- 避免使用下划线或混合大小写
- 避免使用缩写(除非是广泛使用的)
# 包职责
- 每个包应该有一个明确的职责
- 包名应该反映其功能
- 避免循环依赖
- 保持包的独立性
# 导入组织
- 标准库包
- 第三方包
- 内部包
# 示例
import (
// 标准库
"fmt"
"net/http"
// 第三方包
"github.com/gin-gonic/gin"
"github.com/go-sql-driver/mysql"
// 内部包
"myproject/internal/auth"
"myproject/pkg/utils"
)
模块管理
Go模块的使用和管理。
# 初始化模块
go mod init myproject
# 添加依赖
go get github.com/gin-gonic/gin
# 更新依赖
go get -u github.com/gin-gonic/gin
# 整理依赖
go mod tidy
# 验证依赖
go mod verify
# 查看依赖
go list -m all
# go.mod 示例
module myproject
go 1.21
require (
github.com/gin-gonic/gin v1.9.1
github.com/go-sql-driver/mysql v1.7.1
)
replace (
github.com/gin-gonic/gin => ./vendor/github.com/gin-gonic/gin
)