项目开发-目录结构 | Go

如果仅是一个简单的功能,项目的布局并不需要精心设计。而在项目逐渐扩大的过程中,保持良好的代码结构非常重要。如果不注意,最终可能会得到一个混乱的代码,其中包含大量隐藏的依赖项和全局状态。当项目有更多的参与者时,也需要更多的组织结构。因此,了解如何有效地管理包和库、组织项目的布局是非常重要的。

项目的目录结构没有统一的模板,不同项目的目录结构,要依据项目类型、大小及灵活程度做调整,但也遵循一定的规范。

命名要求和规范

  1. 命名清晰:目录命名要清晰、简洁,不要太长,也不要太短。目录名要能清晰地表达出该目录实现的功能,并且目录名最好用单数(特殊情况,如 /docs、/examples)。一方面是因为单数足以说明这个目录的功能,另一方面可以统规范,避免单复混用的情况。

  2. 功能明确:一个目录所要实现的功能应该是明确的、并且在整个项目目录中具有很高的辨识度。当需要新增一个功能时,我们能够非常清楚地知道把这个功能放在哪个目录下。

  3. 全面性:目录结构应该尽可能全面地包含研发过程中需要的功能,例如文档、脚本、源码管理、API 实现、工具、第三方包、测试、编译产物等

  4. 可观测性:项目规模一定是从小到大的,所以一个好的目录结构应该能够在项目变大时,仍然保持之前的目录结构。

  5. 可扩展性:每个日录下存放了同类的功能,在项目变大时,这些目录应该可以存放更多同类功能。

MVC模式

MVC(Model View Controller)是软件工程中的一种软件架构模式,该模式将用户界面和业务逻辑分离,以使代码可扩展性、可复用性、可维护性、灵活性加强。它把软件系统分为三个基本部分:模型(model)、视图(view)、控制器(controller)。

View层是界面,Model层是业务逻辑,Controller层用来调度View层和Model层,将用户界面和业务逻辑合理的组织在一起,起粘合剂的效果。

Golang项目目录结构也有一些MVC的影子。

示例目录结构

  • golang-standards/project-layout

    ├── api  
    ├── assets
    ├── build
    ├── cmd
    ├── configs
    ├── deployments
    ├── docs
    ├── examples
    ├── githooks
    ├── go.mod
    ├── init
    ├── internal
    ├── LICENSE.md
    ├── Makefile
    ├── pkg
    ├── README_zh-CN.md
    ├── scripts
    ├── test
    ├── third_party
    ├── tools
    ├── vendor
    ├── web
    └── website  
    
  • gin-vue-admin

    ├── server
        ├── api             (api层)
        │   └── v1          (v1版本接口)
        ├── config          (配置包)
        ├── core            (核心文件)
        ├── docs            (swagger文档目录)
        ├── global          (全局对象)                    
        ├── initialize      (初始化)                        
        │   └── internal    (初始化内部函数)                            
        ├── middleware      (中间件层)                        
        ├── model           (模型层)                    
        │   ├── request     (入参结构体)                        
        │   └── response    (出参结构体)                            
        ├── packfile        (静态文件打包)                        
        ├── resource        (静态资源文件夹)                        
        │   ├── excel       (excel导入导出默认路径)                        
        │   ├── page        (表单生成器)                        
        │   └── template    (模板)                            
        ├── router          (路由层)                    
        ├── service         (service层)                    
        ├── source          (source层)                    
        └── utils           (工具包)                    
            ├── timer       (定时器接口封装)                        
            └── upload      (oss接口封装)
    
  • 示例

    ├── conf        (配置初始化)
    ├── cache       (缓存处理)
    ├── controller  (请求入口)
    ├── biz         (业务逻辑)
    ├── errorcode   (错误处理)
    ├── format      (格式化数据处理)
    ├── logs        (日志)
    ├── middleware  (中间件)
    ├── model       (数据关系映射)
    ├── request     (参数处理)
    ├── router      (路由)
    ├── service     (服务底层处理/远程调用)
    ├── utils        (工具类)
    
  • 示例

    ├── app                (应用)
        ├── api            (控制层)
        ├── consts         (常量定义)
        ├── dao            (数据层)
            ├── internal   (模型生成)
        ├── middleware     (中间件)
        ├── model          (处理数据类型定义)
        ├── request        (请求返回定义)
        ├── service        (服务层)
    ├── conf               (配置项)
    ├── core               (核心)
    ├── docs               (文档生成)
    ├── logs               (日志)
    ├── router             (路由)
    ├── utils              (工具)
    

版权声明:本博客所有文章除特别声明外,均采用 CC BY 4.0许可协议,转载请注明出处
本文链接:https://blog.redamancy.tech/technique/19