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的优势:无需担心配置文件的格式。
- 通过Get(key string): int 方法根据值的类型获取值
步骤 —— 选择设定模式
选择设定模式,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方法
传入参数是指针类型的组群,无返回值
进入到Logger方法中:
- c.Next()方法作用是挂载,就是一个请求进来之后到这个位置就先停下来等返回的时候再执行下面的参数。
- time.Sub(time2)方法计算两时间的差
- 其中很多都与http协议有关,接下来有时间就写篇http通信协议的博客
- 这里可以了解到日志级别的分类标准
- 采用这种日志打印的格式来写入日志
- 静态文件服务挂在 RouterGroup 上,可以提供一个基于网络的静态文件系统,也可以提供一个基于内存的静态文件系统
步骤 —— 路由按照功能分组
- 根据各个业务进行二次路由分组,传入指针类型的RouterGroup参数
先实例化三个结构体
通过c.ShouldBindJSON方法将请求参数绑定到指针类型的结构体l上。
如果错误就打印错误信息并且调用统一返回方法返回相关信息。
下面的代码涉及到redis数据,所以先对redis相关操作进行下了解:
这是数据库相关操作,统一放在一个包里,先看redis:
-
主要是一些基本配置,返回的是一个数据库连接池,是一个指针类型的结构体
-
TestOnBorrow属性作用是再次连接之前查看空闲连接的健康状态,如果返回错误则关闭连接
-
c.Do表示的是执行自定义的命令
-
Ping命令使用客户端向Redis服务端发送一个PING,如果服务器正常运行,返回一个PONG,通常用于测试与服务器的连接是否仍然有效
先从连接池中取出一个连接
使用defer在插入值完成之后将该连接放回连接池中
c.Do()方法插入redis
设置成功返回1,当key不存在或不能为key设置过期时间时返回0
前两步同上,
json.Marshal()接受一个空接口类型的数据,编码后返回二进制类型的数据,对于返回的这个value进行判断,如果不存在插入,如果存在则返回错误
获取k对应的二进制数组类型的值
mysql初始化
使用sqlx.Open()连接数据库,返回一个抽象的数据库:DB
SetMaxIdleConns:设置最大空闲数据库连接数
DB.Ping判断数据库连接是否成功
先从数据库查询出该学号的密码然后再调用工具包中的方法进行判断,返回true/false
Scan方法传入的是指针类型的参数。
查询用的是QueryRow
如果匹配返回的是用户id否则返回的是0