首页 > 其他分享 >解构Go项目结构:别再乱放代码了!

解构Go项目结构:别再乱放代码了!

时间:2024-12-14 22:04:05浏览次数:7  
标签:repository 乱放 go internal user Go 解构 pkg

今天就捋一捋,如何组织一个优雅的Go Web项目。

├── cmd/                   # 项目入口目录
│   └── main.go           # 主程序入口
├── internal/             # 私有代码目录
│   ├── handler/         # HTTP处理器(等同于Controller)
│   │   └── user.go
│   ├── service/         # 业务逻辑层
│   │   └── user.go
│   ├── repository/      # 数据访问层(等同于DAO)
│   │   └── user.go
│   └── model/          # 数据模型
│       └── user.go
├── pkg/                 # 可被外部引用的包
│   ├── middleware/     # 中间件
│   ├── config/        # 配置
│   └── utils/         # 工具函数
├── api/                # API文档(Swagger/OpenAPI)
│   └── swagger.json
├── configs/            # 配置文件目录
│   └── config.yaml
├── scripts/           # 构建、部署脚本
├── test/             # 测试文件目录
└── go.mod            # Go模块文件

为什么要这样组织?

  1. 关注点分离:handler/service/repository 这种分层架构,是从 Java 等语言借鉴来的最佳实践,可以让代码职责更清晰。
  2. internal机制:Go的internal目录很特别,其他项目无法导入这个目录下的代码,可以防止核心业务逻辑被外部使用。
  3. pkg共享机制:想要被其他项目复用的代码就放在pkg下,比如一些通用的中间件、工具函数等。

项目案例推荐:

  1. Go-Clean-Template: https://github.com/evrone/go-clean-template 这是一个遵循清晰架构的Gin项目模板,star数4k+,值得参考。

  1. Gin-Vue-Admin: https://github.com/flipped-aurora/gin-vue-admin 一个完整的前后端分离权限管理系统,后端就是用Gin实现的,star数17k+。

个人建议:

  1. 统一错误处理:在pkg下可以定义统一的错误类型和处理机制
  2. 规范日志:建议在pkg下封装统一的日志组件
  3. 配置管理:用viper之类的库来管理配置文件
  4. 依赖注入:可以考虑用wire来管理依赖

举个例子,一个用户注册功能的代码组织:

// internal/handler/user.go
func (h *UserHandler) Register(c *gin.Context) {
    // 处理HTTP请求参数
    // 调用service层
}

// internal/service/user.go
func (s *UserService) Register(user *model.User) error {
    // 处理业务逻辑
    // 调用repository层
}

// internal/repository/user.go
func (r *UserRepository) Create(user *model.User) error {
    // 数据库操作
}

没有最好的项目结构,只有最适合你团队的结构。以上只是推荐,可以根据实际需求调整。

求加关注的请点赞!你的支持就是我继续创作的动力!

标签:repository,乱放,go,internal,user,Go,解构,pkg
From: https://blog.csdn.net/qq_63315166/article/details/144477133

相关文章

  • 【Google Cloud】VPC Service Controls 的试运行模式
    本文介绍了VPC服务控制的试运行模式。什么是VPCServiceControlsVPCServiceControls是GoogleCloud(以前称为GCP)的一项安全功能。它通过设置一个被称为边界的逻辑围栏,防止从内部到外部和从外部到内部的双向意外访问,从而增强对Google云各种服务API的安全保护......
  • 10大关键技术解构:智能合同审查系统全景解析
    前言随着企业数字化转型的深入,合同管理在业务流程中的重要性愈加凸显。传统的人工审查合同方式不仅耗时耗力,还容易出现疏漏,尤其在复杂法律条款和跨部门协作的场景中,这一问题尤为明显。为了解决这一痛点,思通数科智能合同审查系统应运而生。基于人工智能和大数据分析的技术,这一系统......
  • 2024-12-14:K 周期字符串需要的最少操作次数。用go语言,给定一个长度为n的字符串 word
    2024-12-14:K周期字符串需要的最少操作次数。用go语言,给定一个长度为n的字符串word和一个整数k,k是n的因数。每次操作可以选择两个下标i和j,使得i和j都可以被k整除,然后用从j开始的长度为k的子串替换从i开始的长度为k的子串。要使得word成为一个K周期字符串,需要进行最少的操作次数......
  • Go实战全家桶之二十四: 指标系统的一个大坑
    历史代码:大坑指标系统的代码使用的时间标准time,.Local而PC上是Asia/Shanghai,而linux环境为utc而es存贮的是utc时间,不能简单的用+8,-8而是计算查询用北京时间,保存按utc\还有一个问题用的是utc天执行的定时任务解决办法:测试func(self*TestGeneralserviceSuite)Test00......
  • Google在架包分析-巴西4
    包信息之前在应用榜找的几个包都是一家的,一样的方案没啥好分析的。这次就换游戏榜里面找了个包,直接看图标找很好找。逆向分析安装运行,刚开始还是进的A面小游戏,然后我说来抓个包看下,重新打开了一下app,结果直接就B面了,给我整不会了。。。现在的上架方案都这么随意进b面......
  • django-python开发
    确保你已经安装了Django。如果没有安装,可以通过pip安装:pipinstalldjango创建一个新的Django项目:django-adminstartprojectdjango_test运行开发服务器:cddjango_testpythonmanage.pyrunserverpythonmanage.pyrunserver0.0.0.0:8008如果你需要创建一个应用程序,可以使用......
  • Vue2.0+Node.js+MongoDB全栈打造商城系统
    Vue2.0+Node.js+MongoDB全栈打造商城系统F:\Vue教程\Vue2.0+Node.js+MongoDB全栈打造商城系统\第1章课程介绍1.1导学.mp4vue框架对比Vue和React对比.Angular提供的更多是一整套解决方案,后者更像是一个生态.Vue和React目前都使用了VirtualDomvue框架对比Vue·模板和渲染......
  • django停车场管理系统-毕业设计源码16856
    目 录1绪论1.1研究背景和意义1.2国内外研究现状1.3论文结构与章节安排2 系统分析2.1可行性分析2.1.1技术可行性分析2.1.2 经济可行性分析2.1.3操作可行性分析2.2系统功能分析2.2.1功能性分析2.2.2非功能性分析2.3 系统用例分析2.4系......
  • gofiber: 请求参数是数组的处理
    一,js处理数组的形式:js的处理:varaddIdList=[];for(i=0;i<content.length;i++){if(content[i].checked){addIdList.push(content[i].value);}}console.log("选中的id:");......
  • golang: 指针和地址
    一,指针和地址的操作1,代码:要掌握以下三个用法:  *指针变量名 得到指针所指向的变量  *类型   表示这是一个此类型的指针  &变量   返回一个存放变量地址的指针packagemainimport("fmt""reflect")funcisPointer(vinterface{})......