GoLang Gin实际使用

所有代码同步到Admin/gitDemo - Gitee.comhttps://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

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

2.创建router

Go 复制代码
package router

import (
	"github.com/gin-gonic/gin"
)

func APIRouter() *gin.Engine {
	r := gin.Default()
	v1 := r.Group("//v1")
	api := v1.Group("/api")

	userRoutes := UserRoutes
	userRoutes(api)
	return r
}

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

Go 复制代码
package service

import (
	"ginDemo/internal/response"
	"github.com/gin-gonic/gin"
)

type Response response.NorResponse

type UserService interface {
	Login(ctx *gin.Context) any
	Logout(ctx *gin.Context) any
	GetUser(ctx *gin.Context) any
	AddUser(ctx *gin.Context) any
	UpdateUser(ctx *gin.Context) any
	DeleteUser(ctx *gin.Context) any
}

4.同级目录创建Imp

指定UserService得注入方法为ServiceImp

Go 复制代码
package service

import (
	"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

Go 复制代码
package controller

import (
	"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了,有种僵尸变人得感觉

Go 复制代码
package router

import (
	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,运行即可得到结果

Go 复制代码
[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"
相关推荐
RationalDysaniaer1 天前
Gin入门笔记
笔记·gin
千年死缓1 天前
gin中间件
中间件·gin
codists5 天前
《使用Gin框架构建分布式应用》阅读笔记:p393-p437
golang·gin·编程人
景天科技苑5 天前
【Golang】Gin框架中如何使用JWT来实现登录认证
开发语言·golang·gin·jwt·登录认证·go jwt
产幻少年7 天前
gin框架可以构建微服务吗?
微服务·gin
get2007 天前
golang gin ShouldBind的介绍和使用
开发语言·golang·gin
codists8 天前
《使用Gin框架构建分布式应用》阅读笔记:p272-p306
后端·go·gin
codists8 天前
《使用Gin框架构建分布式应用》阅读笔记:p212-p233
笔记·golang·gin·编程人·codists·gin框架
knoci8 天前
【Go】-基于Gin框架的博客项目
后端·学习·golang·gin
codists10 天前
《使用Gin框架构建分布式应用》阅读笔记:p251-p271
golang·gin·编程人