GoLang Gin实际使用

news/2024/9/23 8:14:36/

所有代码同步到Admin/gitDemo - Gitee.comgins/CsdnLink/icons/icon-default.png?t=N7T8" alt="icon-default.png?t=N7T8" />https://gitee.com/mec-deployment-team_0/git-demo/tree/dev/

1.创建Gin框架

一般设计一个常规的web项目,都需要以下几个模块

  1. runApp 主函数,运行整个项目
  2. routes 路由控制,管理跳转以及路由分组
  3. controllers 管理路由跳转后执行的逻辑
  4. service/serviceImp 管理执行的具体业务,依赖注入时可以做实体接口分离
  5. dao 管理数据库连接,数据库控制
  6. filters 中间件,全局,路由分组中注入额外的执行方法,例如token,cors
  7. logs 日志系统,交给运维处理
  8. configs 额外的属性配置,例如数据库连接信息,文件上传大小,线程池大小

以上就是常规的后端项目基本需要的内容,随着业务的变深入,可以在加深,例如公有的utils,返回的异常code解释等,但是希望保留核心,做项目之前不用像无头苍蝇一样先做出来,按个人喜好设计就行了,后期做目录优化也行。

设计了一个简单的目录结构如下

├─cmd
│  └─ginDemo   //与项目名称一致,存放主函数main
├─deployments //部署文件
├─docs  //swagger信息
├─internal  // 放置项目私有信息
│  ├─config  //数据库等配置
│  ├─dao  // 数据库执行业务,也可以放在pkg内
│  ├─handler  // 中间件,处理切面业务
│  ├─model  // 模型,做数据库映射
│  ├─requests  // 请求格式校验
│  ├─responses // 返回信息校验
│  └─src  // 信息资源
├─pkg // 显示内容
│  ├─router  // 路由处理
│  ├─server  // 具体业务
│  │  ├─controller  // 控制器
│  │  └─service  // 业务接口,解耦
│  │      └─serviceImp  // 实际业务,可以与service合并
│  └─storage  // redis等处理
└─utils  // 共享工具类,转化,json处理等 

以上为我个人设计的 一个项目结构,看似非常多,但是主核心为三个

  1. cmd 存放主函数
  2. interval 存放model等不开放的模型信息
  3. pkg 存放与前端交互的实际业务

其余的内容一般在以后都可能会遇到,因此暂时不删除。这个项目与springboot的项目结构基本类似,一般常用于实际的业务中,关注点在于,server可能会很多,因此量大了之后要分不同模块的app进行切分,不然不好处理。

2.创建MVC主流程

Gin有几个缺点

  1. 不能像java一样可以直接在方法上添加路由注解,导致路由需要在route内进行集中匹配
  2. 不能添加service注解,导致需要在controller类里进行service匹配,费时费力
  3. 一般serive和Imp不分家,耦合性比较高
  4. 由于没有类,所以用struct代替类,每个方法前添加struct指针去指定方法归属

但是又几个优点

  1. 极佳的启停速度,开启时间与flask,springboot相比简直光速
  2. 没有java脱了裤子放屁的@lombok,结构体直接一步搞定model
  3. 拦截器过滤器都统一成为handler,触发机制简单
  4. 并发量极大,但是对我来说没什么感觉

1.创建main

func main() {r := router.APIRouter()err := r.Run(":8080")if err != nil {return}
}

2.创建router

package routerimport ("github.com/gin-gonic/gin"
)func APIRouter() *gin.Engine {r := gin.Default()v1 := r.Group("//v1")api := v1.Group("/api")userRoutes := UserRoutesuserRoutes(api)return r
}

3.创建service接口(没啥用)

package serviceimport ("ginDemo/internal/response""github.com/gin-gonic/gin"
)type Response response.NorResponsetype UserService interface {Login(ctx *gin.Context) anyLogout(ctx *gin.Context) anyGetUser(ctx *gin.Context) anyAddUser(ctx *gin.Context) anyUpdateUser(ctx *gin.Context) anyDeleteUser(ctx *gin.Context) any
}

4.同级目录创建Imp

指定UserService得注入方法为ServiceImp

package serviceimport ("github.com/gin-gonic/gin"
)type UserServiceImp struct{}func NewUserService() UserService {return &UserServiceImp{}
}func (receiver *UserServiceImp) Login(ctx *gin.Context) any {return "ok"
}
func (receiver *UserServiceImp) Logout(ctx *gin.Context) any {return Response{}
}
func (receiver *UserServiceImp) GetUser(ctx *gin.Context) any {return Response{}
}
func (receiver *UserServiceImp) AddUser(ctx *gin.Context) any {return Response{}
}
func (receiver *UserServiceImp) UpdateUser(ctx *gin.Context) any {return Response{}
}
func (receiver *UserServiceImp) DeleteUser(ctx *gin.Context) any {return Response{}
}

5.创建controller

package controllerimport ("ginDemo/pkg/server/service""github.com/gin-gonic/gin""net/http"
)// UserController 定义结构体
type UserController struct {userService service.UserService
}// NewUserController 依赖注入userService,userService通过Newxxx依赖注入
func NewUserController(UserService service.UserService) *UserController {return &UserController{userService: UserService}
}// Login 指定结构体对应的方法
func (u *UserController) Login(ctx *gin.Context) {response := u.userService.Login(ctx)ctx.JSON(http.StatusOK, response)
}

6.routes关联方法

依赖注入转为new了,有种僵尸变人得感觉

package routerimport (controller "ginDemo/pkg/server/controller""ginDemo/pkg/server/service""github.com/gin-gonic/gin"
)func UserRoutes(r *gin.RouterGroup) {userService := service.NewUserService()userController := controller.NewUserController(userService)r.GET("/user/login", userController.Login)
}

okk,运行即可得到结果

[GIN-debug] GET    /v1/api/user/login        --> ginDemo/pkg/server/controller.(*UserController).Login-fm (3 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Listening and serving HTTP on :8080
[GIN] 2024/04/28 - 22:29:34 | 200 |       707.6µs |             ::1 | GET      "/v1/api/user/login"
[GIN] 2024/04/28 - 22:37:09 | 404 |            0s |             ::1 | GET      "/"
[GIN] 2024/04/28 - 22:37:17 | 404 |            0s |             ::1 | GET      "/v1/api/login"
[GIN] 2024/04/28 - 22:37:25 | 200 |            0s |             ::1 | GET      "/v1/api/user/login"


http://www.ppmy.cn/news/1448077.html

相关文章

windows编程中的位图操作,界面中插入位图方法

在界面中插入位图,主要用到BitBlt这个函数 BOOL CDC::BitBlt(int x, int y, int width, int height, CDC *src, int src_x, int src_y, DWORD dwRop)用法说明见官方说明 这里要注意的是,这个函数是把源图像从src这个设备上下文传递到目标设备上下文(这…

【类型商店】字符字符串(上)

啊,哈喽,小伙伴们大家好。我是#Y清墨,今天呐,我要介绍的是字符与字符串。 导语 在我之前发的[算法材料包]C数字拆分里有提及到.size()和length()和strlen(),想看更多内容请别划走! 一.论字符 (1&#xff…

Java面试题:解释堆和栈的OutOfMemoryError通常在什么情况下会发生

在Java中,OutOfMemoryError(OOM)是一个运行时错误,它表明Java虚拟机(JVM)在尝试分配内存时无法找到足够的空间。这个错误可能发生在堆内存或栈内存耗尽时。以下是一些常见的导致OutOfMemoryError的情况&…

第三章:信息系统基础知识之信息系统概述

信息系统概述 信息系统(Information System,IS)一般泛指收集、存储、处理和传播各种信息的具有完整功能的集合体。现代信息系统总是与计算机技术和互联网技术的应用联系在一起,主要是指以计算机为信息处理工具,以网络为信息传输手段的信息系统…

【FastGPT 】FastGPT 的知识库逻辑

这里写自定义目录标题 FastGPT 的知识库逻辑FastGPT 的知识库检索机制FastGPT 的知识库逻辑 FastGPT的知识库逻辑主要围绕“向量搜索 + 大模型 = 知识库问答”的公式展开。以下是关于FastGPT知识库逻辑的一些关键点: 基础概念: 向量:将人类的语言(文字、图片、视频等)转换…

el-date-picker 禁用时分秒选择(包括禁用下拉框展示)

2024.04.26今天我学习了对el-date-picker进行禁用时分秒, 在使用el-date-picker组件的时候,我们有可能遇到需要把时分秒的时间固定,然后并且不能让他修改: 1714120999296 比如右上角的这个时间,我们要给它固定是‘08:…

ASUS华硕ROG幻15笔记本GU502GU原装出厂Windows10系统工厂模式安装包下载,带MyASUS WinRE恢复重置功能

华硕ROG Zephyrus M15笔记本原厂Win10预装OEM系统,恢复开箱状态 适用型号:GU502GW,GU502GU,GU502GV 链接:https://pan.baidu.com/s/1lTK_CUFT9N3q0sXBS7ENPg?pwd8hm2 提取码:8hm2 华硕原装W10系统工厂…

「 网络安全常用术语解读 」软件物料清单SBOM详解

1. 概览 软件物料清单(Software Bill of Materials,SBOM)是软件成分信息的集合,SBOM文件中记录了软件产品或服务所使用组件、库、框架的清单,用于描述软件构建过程中使用的所有组件及其关系,以实现软件供应…