Golang项目目录结构最佳实践
Golang项目目录结构最佳实践 谁能解释一下标准的Go项目文件夹结构(工业级)是怎样的?
很高兴听到这个消息。我刚刚在网上搜索了一下,并发布了一个看起来不错的项目链接。当然,有很多博客文章讨论这个问题,也有很多GitHub项目提出了结构方案。
我怀疑是否存在一个“工业级”的项目结构,只有好的和不好的之分。
除了文档中指定的标准文件夹外,虽然没有另一个行业级别的标准,但有一些方案可以满足部分用户的需求。你可以考虑其中一些非常流行的方案,但如果符合你的需求,也可以(在一定的限度内)自由使用你自己的结构。
一次简单的网络搜索会找到各种类似的结果:
golang-standards/project-layout
标准 Go 项目布局。通过在 GitHub 上创建账户来为 golang-standards/project-layout 的开发做出贡献。
我认为我的做法与那个足够不同,我应该修改我的评论。
我确实遵循这样的惯例:包应该放在 /pkg 目录下,文档放在 /docs 目录下,命令行应用程序放在 /cmd 目录下。然而,我使用 /build 作为一个被 .gitignore 忽略的目录,用于存放构建好的二进制文件和其他文件;使用 /images 存放预构建的镜像;使用 /data 存放静态数据文件。
在工业级Go项目中,典型的目录结构遵循标准布局,同时根据项目规模进行适当调整。以下是一个常见的结构示例:
project/
├── cmd/
│ ├── api/
│ │ └── main.go
│ └── cli/
│ └── main.go
├── internal/
│ ├── handler/
│ ├── service/
│ └── repository/
├── pkg/
│ ├── utils/
│ └── models/
├── api/
│ └── openapi.yaml
├── configs/
├── deployments/
├── scripts/
├── test/
├── go.mod
├── go.sum
└── Makefile
关键目录说明:
- cmd/: 包含应用程序的入口点,每个子目录对应一个可执行文件
// cmd/api/main.go
package main
import "project/internal/handler"
func main() {
handler.StartServer()
}
- internal/: 私有应用程序代码,外部项目无法导入
// internal/handler/user.go
package handler
type UserHandler struct {
service UserService
}
func (h *UserHandler) CreateUser(c *gin.Context) {
// 处理逻辑
}
- pkg/: 公共库代码,可供外部项目导入
// pkg/utils/validator.go
package utils
func ValidateEmail(email string) bool {
// 验证逻辑
return true
}
-
api/: API定义文件(OpenAPI/Swagger等)
-
configs/: 配置文件模板或默认配置
-
test/: 额外的测试文件和数据
实际项目示例:
// 模块导入示例
import (
"project/internal/service"
"project/pkg/utils"
"project/pkg/models"
)
这种结构清晰分离了关注点,遵循Go的包管理原则,便于团队协作和代码维护。

