Golang标准项目布局

刚接触Golang不久,想请教下大家关于标准项目布局的问题。目前项目结构比较混乱,不知道该如何合理组织目录和文件。比如:

  1. 应该把配置文件放在哪里?
  2. 业务逻辑代码和接口代码要怎么分离?
  3. 单元测试文件应该和源文件放一起还是单独目录?
  4. 第三方库的依赖管理要怎么处理?
  5. 有没有推荐的目录命名规范?

想知道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            # 项目说明

关键目录说明:

  1. cmd/
    每个子目录是一个可执行程序入口,main.go应保持简洁,仅包含初始化和启动逻辑。

  2. internal/
    Go工具链会禁止外部项目导入此目录代码,实现封装性。

  3. 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语言的习惯用法,适合团队协作和项目维护。具体可根据项目规模适当调整,微服务项目通常更简单,而大型单体应用可能需要更细化的分层。

回到顶部