GoLang Gin实际使用

所有代码同步到Admin/gitDemo - Gitee.comicon-default.png?t=N7T8https://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.hqwc.cn/news/661064.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java | Leetcode Java题解之第62题不同路径

题目&#xff1a; 题解&#xff1a; class Solution {public int uniquePaths(int m, int n) {long ans 1;for (int x n, y 1; y < m; x, y) {ans ans * x / y;}return (int) ans;} }

jenkins教程

jenkins 一、简介二、下载安装三、配置jdk、maven和SSH四、部署微服务 一、简介 Jenkins是一个流行的开源自动化服务器&#xff0c;用于自动化软件开发过程中的构建、测试和部署任务。它提供了一个可扩展的插件生态系统&#xff0c;支持各种编程语言和工具。 Jenkins是一款开…

启发式搜索算法4 -遗传算法实战:吊死鬼游戏

相关文章: 启发式搜索算法1 – 最佳优先搜索算法 启发式搜索算法2 – A*算法 启发式搜索算法2 – 遗传算法 有一个小游戏叫吊死鬼游戏&#xff08;hangman&#xff09;&#xff0c;在学习英语的时候&#xff0c;大家有可能在课堂上玩过。老师给定一个英文单词&#xff0c;同学们…

从0到1手写注册中心Registry之集群选主

一、领域对象 Cluster&#xff1a;描述集群信息 port描述当前服务端口&#xff1b;host描述当前服务主机&#xff1b;myself描述当前服务本身&#xff1b;servers描述当前服务集群列表registryConfigProperties配置信息&#xff1b;executor定时任务&#xff0c;负责更新服务…

linux部署java1.8(java17)

两种方式&#xff1a; 方式一 1.输入查找命令&#xff1a; yum -y list java*2.输入安装命令&#xff1a; yum install -y java-1.8.0-openjdk.x86_643.测试是否已经安装&#xff1a; java -version方式二&#xff1a; 点击链接进入官网&#xff1a;https://www.oracle.com/…

Go 语言(三)【面向对象编程】

1、OOP 首先&#xff0c;Go 语言并不是面向对象的语言&#xff0c;只是可以通过一些方法来模拟面向对象。 1.1、封装 Go 语言是通过结构体&#xff08;struct&#xff09;来实现封装的。 1.2、继承 继承主要由下面这三种方式实现&#xff1a; 1.2.1、嵌套匿名字段 //Add…

24五一杯ABC题详细建模思路+可执行代码+成品论文+图表(免费参考资料)

比赛题目的完整版思路可执行代码数据参考论文都会在第一时间更新上传的&#xff0c;大家可以参考我往期的资料&#xff0c;所有的资料数据以及到最后更新的参考论文都是一次付费后续免费的。注意&#xff1a;&#xff08;建议先下单占坑&#xff0c;因为随着后续我们更新资料数…

TCP重传,滑动窗口,流量控制,拥塞控制

TCP重传&#xff0c;滑动窗口&#xff0c;流量控制&#xff0c;拥塞控制 TCP重传机制&#xff1a; 超时重传快速重传SACKD-SACK 通过序列号与确认应答判断是否要重传 超时重传&#xff1a; 超过指定时间没有收到确认应答报文&#xff0c;就会重发该数据 触发超时重传的情况…

【嵌入式笔试题】进程线程笔试题

非常经典的笔试题。 1.进程&线程(16道) 1.1异步IO和同步IO区别? 答案:如果是同步IO,当一个IO操作执行时,应用程序必须等待,直到此IO执行完。 相反,异步IO操作在后台运行,IO操作和应用程序可以同时运行,提高系统性能,提 高IO流量。 解读:在同步文件IO中,线…

c#数据库: 10.调用存储过程查询信息,并显示在窗体上

查询女生信息&#xff0c;并将信息显示在窗体上: 原数据表//右键数据库名,新建查询 ------------- 新建查询窗口,添加新建存储过程Procedure_GetGirls1和查询代码如下 : CREATE PROCEDURE dbo.Procedure_GetGirls1 /*存储过程名称*/ AS SELECT * f…

Taro引入echarts【兼容多端小程序(飞书/微信/支付宝小程序)】

近期接到公司新需求&#xff0c;开发飞书小程序&#xff0c;并且原型中含有大量的图表&#xff0c;本想使用飞书内置图表组件 —— chart-space&#xff0c;但官方表示已经停止维护了&#xff0c;无奈之下&#xff0c;只能另寻他路&#xff0c;于是乎&#xff0c;图表之王&…

vue 脚手架 创建vue3项目

创建项目 命令&#xff1a;vue create vue-element-plus 选择配置模式&#xff1a;手动选择模式 (上下键回车) 选择配置&#xff08;上下键空格回车&#xff09; 选择代码规范、规则检查和格式化方式: 选择语法检查方式 lint on save (保存就检查) 代码文件中有代码不符合 l…