Golang 项目目录结构设计思考

简介: 软件架构设计的最终目标是能够用最小的人力成本来满足构建和维护该系统的需求。软件是为业务服务的,所以一个软件的好坏我想应该就是能够让开发者低成本学习和维护,并利用其帮助业务创造更大的利益。所以感觉这句话很对:“**软件架构师必须创建出一个可以让功能实现起来更容易、修改起来更简单、扩展起来更轻松的软件架构。”**

前言

因进行 Golang 项目开发也有很长的一段时间。这里主要是对在项目结构上的设计做个记录。本文主要讲述在搭建项目框架时的一些设计和思考。主要思考点:什么样的项目结构才清晰易于使用?什么样的项目结构才是你想要的?

目录结构设计

MVC 可以说是接触最多,谈论也是比较多的一个项目结构。无论之前在进行 Java 开发或者是 C# 开发的时候基本都会有在使用的一种项目目录结构:控制器层处理输入,视图显示数据,实体模型。

所以在设计 Golang 项目目录结构的时候也会有一些 MVC 的影子在里面。在基于 gin 框架时 然后划分成路由、处理层、实体层。但是这样的结构肯定有很多问题,比如处理层所承载的业务逻辑功能太重,业务耦合太高,在后续的维护或者扩展肯定会有更大的问题,增加维护成本。

像 Java 中 spring /springboot 的框架,会根据相应的功能划分的比较清楚:

  • Dao 层 进行和数据库交互
  • Model 层 和数据库表对应
  • Service 层 进行具体的逻辑实现
  • Controller 层,处理的入口,但基本只进行一些入参和其他参数规则的娇艳
  • Dto 一些入参映射以及响应参数的对应的类

所以使用的习惯下,会根据一个请求路由到和数据库交互这样的一个处理形成一个顺序链:router-handler-service-repository-entities 。每层负责处理专门的功能,从而进行解耦。

-- router (路由)
-- dto (入参和响应对应的结构体)
-- handler (其实就是 controller)
-- service (核心:主要处理业务路基)
-- repository (提供和数据库操作基本方法 CRUD 方法)
-- entities(与数据库表对应)

在使用时根据业务模块都划分,每个模块都有以上的一个处理链的文件,比如:

- entities
   - user.go
   - role.go
- repository(provider)
  - user.provider.go
  - role.provider.go
- modules
  - user
    - user.dto.go
    - user.handler.go
    - user.service.go
    - user.dto.go

将实体和数据库操作独立出来主要是因为这部分基本都是共用比较多的内容,所以没有划分到每个模块里。在 standard go[https://makeoptim.com/golang/standards/project-layout] 项目中的项目目录结构,每个文件都有其重要作用。所以我进行融合形成我现在经常用的目录结构:

- cmd (主干目录)
- config (配置文件)
- internal(不允许被其他项目导入使用的包)
    - entities
    - provider
    - modules
    - routers
- pkg (可以被外部程序安全导入的包)

以上就是我进行项目结构设计的一些思考。整个目录结构就是都要尽量避免出现循环调用的问题。其他还是可以看到很多缺点和不足。其中很大的点就是没有很好表现出 Golang 语言包的特性功能。

这里也推荐大家看看一些其他项目的框架目录设计,比如 goframe 、grafana等等

最后

软件架构设计的最终目标是能够用最小的人力成本来满足构建和维护该系统的需求。软件是为业务服务的,所以一个软件的好坏我想应该就是能够让开发者低成本学习和维护,并利用其帮助业务创造更大的利益。

所以感觉这句话很对:“软件架构师必须创建出一个可以让功能实现起来更容易、修改起来更简单、扩展起来更轻松的软件架构。”

目录
相关文章
|
11月前
|
Go 数据库
Golang 语言编写 gRPC 实战项目
Golang 语言编写 gRPC 实战项目
112 0
|
关系型数据库 MySQL Linux
Docker(三)实战:-Docker部署Golang项目并关联Mysql容器
Dockerfile 文件是用于定义 Docker 镜像生成流程的配置文件,文件内容是一条条指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建;这些指令应用于基础镜像并最终创建一个新的镜像
1311 0
Docker(三)实战:-Docker部署Golang项目并关联Mysql容器
|
4月前
|
存储 测试技术 Go
Golang框架实战-KisFlow流式计算框架(2)-项目构建/基础模块-(上)
KisFlow项目源码位于<https://github.com/aceld/kis-flow,初始阶段涉及项目构建和基础模块定义。首先在GitHub创建仓库,克隆到本地。项目目录包括`common/`, `example/`, `function/`, `conn/`, `config/`, `flow/`, 和 `kis/`。`go.mod`用于包管理,`KisLogger`接口定义了日志功能,提供不同级别的日志方法。默认日志对象`kisDefaultLogger`打印到标准输出。
650 5
Golang框架实战-KisFlow流式计算框架(2)-项目构建/基础模块-(上)
|
4月前
|
Go 开发者
Golang深入浅出之-Go语言项目构建工具:Makefile与go build
【4月更文挑战第27天】本文探讨了Go语言项目的构建方法,包括`go build`基本命令行工具和更灵活的`Makefile`自动化脚本。`go build`适合简单项目,能直接编译Go源码,但依赖管理可能混乱。通过设置`GOOS`和`GOARCH`可进行跨平台编译。`Makefile`适用于复杂构建流程,能定义多步骤任务,但编写较复杂。在选择构建方式时,应根据项目需求权衡,从`go build`起步,逐渐过渡到Makefile以实现更高效自动化。
68 2
|
4月前
|
Go
golang学习3,golang 项目中配置gin的web框架
golang学习3,golang 项目中配置gin的web框架
|
4月前
|
Go
第十二章 Golang家庭收支记账软件项目
第十二章 Golang家庭收支记账软件项目
72 2
|
11月前
|
Go 网络安全 开发工具
在golang中引入私有git仓库的pkg包?引入私有Git仓库的包:在Go语言项目中轻松实现
在golang中引入私有git仓库的pkg包?引入私有Git仓库的包:在Go语言项目中轻松实现
159 0
在golang中引入私有git仓库的pkg包?引入私有Git仓库的包:在Go语言项目中轻松实现
|
10月前
|
Cloud Native 安全 Java
构建高性能云原生应用:使用Golang的实践指南(邮件/短信发送、人脸识别、云点播、云直播项目)
构建高性能云原生应用:使用Golang的实践指南(邮件/短信发送、人脸识别、云点播、云直播项目)
|
设计模式 Go
golang去else最佳项目实践-责任链模式
golang去else最佳项目实践-责任链模式