Golang标准项目布局
刚接触Golang不久,想请教下大家关于标准项目布局的问题。目前项目结构比较混乱,不知道该如何合理组织目录和文件。比如:
- 应该把配置文件放在哪里?
- 业务逻辑代码和接口代码要怎么分离?
- 单元测试文件应该和源文件放一起还是单独目录?
- 第三方库的依赖管理要怎么处理?
- 有没有推荐的目录命名规范?
想知道Golang社区有没有比较公认的标准项目结构?或者有什么最佳实践可以参考?求各位有经验的大神分享下心得~
2 回复
Golang标准项目布局推荐使用Go Modules管理依赖,常见结构如下:
cmd/:存放应用入口文件internal/:私有代码,外部无法导入pkg/:可供外部使用的库代码api/:API定义文件web/:Web相关静态资源configs/:配置文件scripts/:构建/部署脚本test/:测试文件
遵循此布局可保持项目结构清晰,便于维护和协作。
更多关于Golang标准项目布局的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Go语言中,虽然没有官方强制规定的项目布局标准,但社区形成了一些广泛接受的最佳实践。以下是一个常见的标准项目布局结构,适用于大多数中小型项目:
项目根目录结构示例:
/myproject
├── cmd/ # 应用程序入口
│ └── myapp/
│ └── main.go # main函数
├── internal/ # 私有代码(仅本项目使用)
│ ├── handler/ # HTTP处理器
│ ├── service/ # 业务逻辑
│ └── repository/ # 数据访问层
├── pkg/ # 公共库代码(可供外部使用)
│ ├── utils/ # 工具函数
│ └── middleware/ # HTTP中间件
├── api/ # API定义(Protobuf/Swagger)
├── configs/ # 配置文件
├── deployments/ # 部署配置
├── scripts/ # 构建/安装脚本
├── build/ # 构建输出
├── test/ # 额外测试文件
├── docs/ # 文档
├── vendor/ # 依赖(Go Modules启用后可省略)
├── go.mod # 模块定义
├── go.sum # 依赖校验
└── README.md # 项目说明
关键目录说明:
-
cmd/
每个子目录是一个可执行程序入口,main.go应保持简洁,仅包含初始化和启动逻辑。 -
internal/
Go工具链会禁止外部项目导入此目录代码,实现封装性。 -
pkg/
对外暴露的公共库代码,其他项目可以直接导入使用。
示例代码结构:
// cmd/myapp/main.go
package main
import (
"myproject/internal/handler"
"myproject/internal/service"
)
func main() {
svc := service.NewService()
h := handler.NewHandler(svc)
h.Run(":8080")
}
// internal/service/service.go
package service
type Service struct{}
func NewService() *Service {
return &Service{}
}
// internal/handler/handler.go
package handler
type Handler struct {
service *service.Service
}
func NewHandler(s *service.Service) *Handler {
return &Handler{service: s}
}
func (h *Handler) Run(addr string) {
// 启动HTTP服务
}
补充建议:
- 使用Go Modules管理依赖
- 遵循Go命名约定(包名小写,无下划线)
- 在internal内按功能分层(handler/service/repository)
- 重要的公共接口放在pkg目录
- 单元测试文件与源文件放在同一目录
这种布局平衡了结构的清晰度和Go语言的习惯用法,适合团队协作和项目维护。具体可根据项目规模适当调整,微服务项目通常更简单,而大型单体应用可能需要更细化的分层。

