如何优雅的组织Golang项目结构( 二 )

标准布局与官方布局这两种布局有一些共同的思想 。

  • 模块化 。不同的功能会被放入不同的包中,以提高可重用性 。
  • 提高可见性 。根据功能将不同的包存储在不同的目录中,以提高可读性 。
基于这些概念 , 标准布局中有一个通用的cmd目录来存储命令行代码 , 子包用于保存多个命令 , internal目录用于保存不对外共享的代码 。目录路径和包名称与main.go作为入口文件保持一致 。
但是 , 它们对于像pkg和util这样的目录有不同的考虑,例如 , Russ Cox反对以pkg和util等模糊方式命名软件库 。此外 , 由于社区的贡献,标准布局比官方建议覆盖范围更广,添加了像scripts和build这样的目录 。
Go-Clean-Template标准布局和官方布局都是通用的 , 将项目分为cmd项目和非cmd项目 , 因此对于包含entity和dao等多个包的复杂项目(如使用Go开发的Web项目),它们并不是首选 。go-clean-template则专为这类Web项目量身定制 。
go-clean-template/<-- Root directory of the project├── cmd/<-- Main application entry points│└── appname/<-- Specific startup logic and configuration for 'appname' app│└── main.go<-- Main application startup entry├── internal/<-- Internal modules, not importable by external applications│├── entity/<-- Entities (business objects) of the application│├── usecase/<-- Use case layer containing business logic interfaces│├── repository/<-- Data storage interfaces│├── handler/<-- HTTP handlers for receiving requests and calling use cases│└── config/<-- Configuration related code├── pkg/<-- Public library code that can be imported by other projects├── test/<-- External testing code├── .Dockerignore<-- Specifies files to ignore in Docker builds├── .gitignore<-- Specifies intentionally untracked files to ignore in Git├── Dockerfile<-- Docker configuration file for containerization├── go.mod<-- Go module dependencies file├── go.sum<-- Checksums for Go module dependencies└── Makefile<-- Makefile containing automation commands作为标准布局的扩展,go-clean-template保留了pkg目录 , 以便更好地管理众多公共库 。它明确定义了像entity、repository、config等子包,省去了我们为它们命名的工作 。它还有像test和integration-test这样的目录,用于放置相应的测试代码 , 提高可读性 。
小结本文带大家深入研究了组织Go代码库的三种布局:
标准布局提供了一个由社区驱动的、广泛适用的结构,非常适合需要清晰关注点分离的大型项目 。
官方布局由Go的创建者认可,强调简洁和灵活性,适用于各种项目 , 特别是那些优先考虑模块管理的项目 。
基于Clean Architecture原则的go-clean-template在需要将业务逻辑、数据访问和接口层明确分离以提高可维护性和可测试性的项目中表现出色 。
这三种范式适应不同的项目需求 , 每种都提供了一套可自适应和组合的指南 。选择其中之一取决于具体项目的要求、规模和复杂性 。

【如何优雅的组织Golang项目结构】


推荐阅读