第一个基于go-gin框架的项目(一)

本文分享了作者使用Go-gin框架构建社团管理项目的经验,包括配置文件管理、日志处理、数据库连接、路由设置、中间件应用及路由分组。涉及gin框架的多种实践技巧和第三方库Viper的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Go-gin框架经验总结


一,社团管理项目

这是我自己搭建的一个项目环境以及部分功能函数的实现,有些不完善的地方,接下来我还会发几篇相关文章来讲解分析多种基于gin框架所做的一些封装之后的环境。

步骤——main文件:

步骤 —— 调用config包中的Init初始化函数:

在这里插入图片描述

Config方法中的函数作用:

  • viper.AddConfigPath:查找配置文件所在路径
  • viper.SetConfigName:配置文件名称
  • viper.ReadInConfig:查找并读取配置文件
  • 该方法的作用是:用于加载配置文件里的配置参数

LogINfo方法中的函数作用:
这个方法很巧妙:实现了将一天的日志信息打印到一天的log日志中

  • time.Format方法用于对时间进行格式化输出
  • OpenFile方法中的第一个参数是文件路径,第二个参数是控制文件的打开方式,第三个参数则是控制文件模式
  • os.O_RDWR:只读模式
  • os.O_CREATE:创建文件,如果文件不存在
  • os.O_APPEND:追加内容
  • log.SetFlags方法用来设置标准logger的输出配置
  • log.SetOutput方法用于设置标准logger的输出目的地,默认是标准错误输出。

但是Go内置的log库功能有限,例如无法满足记录不同级别日志的情况
在实际的项目中根据自己的需要选择使用第三方的日志库

这个config.go文件的写法:在Init()方法中调用主要方法,方法只实现一个功能,同时记得要在Init方法中进行错误处理。

在这里插入图片描述

步骤 —— 这是一个初始化数据库的文件

sqlx.DB表示数据库,一个DB实例并不是一个链接,但是抽象的表示一个数据库,这就是为什么创建一个DB时并不会返回错误和panic。它内部维护了一个连接池,当需要进行连接的时候尝试连接,可以通过Open创建一个sqlx.DB甚至还可以通过NewDb从已存在的sql.DB中创建一个新的sqlx.DB

  • DB.SetMaxOpenConns:用于设置最大打开的连接数,默认为0表示不限制
  • DB.SetMaxIdleConns:用于设置闲置的连接数
  • DB.Ping:检查与数据库的连接是否仍然有效

涉及到的viper三方库
Viper是适用于Go应用程序的完整配置解决方案
Viper的优势:无需担心配置文件的格式。
Viper优势

  • 通过Get(key string): int 方法根据值的类型获取值
步骤 —— 选择设定模式

SetMode

选择设定模式,gin框架提供了三种模式,这三种模式分别对应不同场景:
开发调试:debug模式
上线:release模式
测试:test模式

步骤 —— 初始化路由并配置中间件

在这里插入图片描述

Default()初始化Engine然后调用gin内置的logger(),Recovery()中间件
Engine是gin框架中最重要的一个struct
Use()是gin的引入中间件的入口
utils.Cors()文件主要为了解决跨域问题

步骤 —— 新建路由组并调用Run方法

在这里插入图片描述

  • r.Group():意思是新建一个路由组
  • router.InitRouter()是向router包里的InitRouter方法传入一个参数
  • log.Printf是打印信息到日志中
  • r.Run()方法内部调用的是http.ListenAndServe(address, engine),这个函数是net/http的函数,然后数据就在net/http中开始流转
步骤 —— router.InitRouter方法

在这里插入图片描述

传入参数是指针类型的组群,无返回值

gin框架使用中间件

进入到Logger方法中:
常用参数

  • c.Next()方法作用是挂载,就是一个请求进来之后到这个位置就先停下来等返回的时候再执行下面的参数。
  • time.Sub(time2)方法计算两时间的差
  • 其中很多都与http协议有关,接下来有时间就写篇http通信协议的博客
    判断日志级别
  • 这里可以了解到日志级别的分类标准

打印日志

  • 采用这种日志打印的格式来写入日志
    在这里插入图片描述
  • 静态文件服务挂在 RouterGroup 上,可以提供一个基于网络的静态文件系统,也可以提供一个基于内存的静态文件系统
步骤 —— 路由按照功能分组

在这里插入图片描述

  • 根据各个业务进行二次路由分组,传入指针类型的RouterGroup参数

路由分组

在这里插入图片描述

先实例化三个结构体
通过c.ShouldBindJSON方法将请求参数绑定到指针类型的结构体l上。
如果错误就打印错误信息并且调用统一返回方法返回相关信息。
下面的代码涉及到redis数据,所以先对redis相关操作进行下了解:
数据库初始化
这是数据库相关操作,统一放在一个包里,先看redis:

在这里插入图片描述

  • 主要是一些基本配置,返回的是一个数据库连接池,是一个指针类型的结构体
    在这里插入图片描述

  • TestOnBorrow属性作用是再次连接之前查看空闲连接的健康状态,如果返回错误则关闭连接

  • c.Do表示的是执行自定义的命令

  • Ping命令使用客户端向Redis服务端发送一个PING,如果服务器正常运行,返回一个PONG,通常用于测试与服务器的连接是否仍然有效

redis插入值

先从连接池中取出一个连接
使用defer在插入值完成之后将该连接放回连接池中
c.Do()方法插入redis

从redis中获取key对应的value
设置key的过期时间

设置成功返回1,当key不存在或不能为key设置过期时间时返回0

判断key是否存在+删除key
在这里插入图片描述

前两步同上,
json.Marshal()接受一个空接口类型的数据,编码后返回二进制类型的数据,对于返回的这个value进行判断,如果不存在插入,如果存在则返回错误

获取key对应的二进制字节数组

获取k对应的二进制数组类型的值

mysql初始化

初始化mysql

使用sqlx.Open()连接数据库,返回一个抽象的数据库:DB
SetMaxIdleConns:设置最大空闲数据库连接数
DB.Ping判断数据库连接是否成功

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

先从数据库查询出该学号的密码然后再调用工具包中的方法进行判断,返回true/false
Scan方法传入的是指针类型的参数。
查询用的是QueryRow
如果匹配返回的是用户id否则返回的是0

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值