项目结构

标准项目结构

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
)