Gin-blog:go1.18在gin上的实践
仓库地址:https://github.com/qingbo1011/gin-Blog
之前已经写过gin的项目了,但是因为一些原因有段时间没有跟进gin了。所以再练手一个gin项目,正好实践一下go1.18。
在gin-memos项目中使用的是MySQL8,看上面的参考博客,貌似使用的是MySQL5?这里就选用MySQL5.7,顺便测试一下gorm在MySQL5.7上的实践。
对了,这个项目看一半吧,有些用法比较老了。但是里面有些功能,比如Cron定时任务等等还是值得学习的。
这项目我跟着写的时候是有点麻的。毕竟是4年前的项目了,很多处理思路跟我实习和之前处理gin-memos的时候完全不一样。但是还是完全照着敲下来学习学习吧。
实现功能
- Gin的基本路由route和API(GET、POST、PUT、DELETE)
- Gin整合Gorm实现对MySQL的增删改查
- Cron定时任务
Getting start
在conf目录下创建config.ini
文件:
1 | #debug or release |
忘记初始化*gorm.DB
报错:
1 | === RUN TestCleanAllTag |
忘记初始化MysqlDB(*gorm.DB)。具体场景是这样的:
在main.go
下,是通过init
函数来进程conf和mysql的初始化的:
1 | package main |
但是在cron.go
下(定时任务),代码如下:
1 | package main |
并没有初始化conf和mysql。
解决方案当然是在cron.go
下写一个init
函数,在init
函数下实现conf和mysql的初始化。
JWT
JWT的学习并没有参考这篇博客。因为他直接把token作为GET Param传进来了,而一般我们都是放在header的。可以参考我的另一个学习项目。(Gin+JWT+Air热部署的简单实践)
Cron定时任务
cron 包,实现了cron
规范解析器和任务运行器,简单来讲就是包含了定时任务所需的功能。
Cron 表达式格式
字段名 | 是否必填 | 允许的值 | 允许的特殊字符 |
---|---|---|---|
秒(Seconds) | Yes | 0-59 | * / , - |
分(Minutes) | Yes | 0-59 | * / , - |
时(Hours) | Yes | 0-23 | * / , - |
一个月中的某天(Day of month) | Yes | 1-31 | * / , - ? |
月(Month) | Yes | 1-12 or JAN-DEC | * / , - |
星期几(Day of week) | Yes | 0-6 or SUN-SAT | * / , - ? |
- Cron表达式表示一组时间,使用6个空格分隔的字段
- 可以留意到Golang的Cron比Crontab多了一个秒级,以后遇到秒级要求的时候就省事了
Cron 特殊字符
- 星号 (
*
):将匹配字段的所有值; - 斜线 (
/
):描述范围的增量,表现为N-MAX/x
,first-last/x
的形式,例如3-59/15
表示此时的第3分钟和此后的每15分钟,到59分钟为止。即从 N 开始,使用增量直到该特定范围结束。它不会重复; - 逗号 (
,
):用于分隔列表中的项目。例如,在 Day of week 使用MON,WED,FRI
将意味着星期一,星期三和星期五; - 连字符 (
-
):用于定义范围。例如,9-17
表示从上午 9 点到下午 5 点的每个小时; - 问号 (
?
):不指定值,用于代替*
,类似_
的存在,不难理解。
预定义的 Cron 时间表
输入 | 简述 | 相当于 |
---|---|---|
@yearly (or @annually ) |
1 月 1 日午夜运行一次 | 0 0 0 1 1 * |
@monthly |
每个月的午夜,每个月的第一个月运行一次 | 0 0 0 1 * * |
@weekly |
每周一次,周日午夜运行一次 | 0 0 0 * * 0 |
@daily (or @midnight ) |
每天午夜运行一次 | 0 0 0 * * * |
@hourly |
每小时运行一次 | 0 0 * * * * |
具体实践参考代码。
心得
1.在写代码的过程中,我发现gin的源码其实是很好看很容易看懂的。比如在用到c.Query
、c.DefaultQuery
和c.Param
时,可能还不明确具体是什么意思,如何使用。这个时候点进去看一下源码就可以了:
1 | // Query returns the keyed url query value if it exists, |
2.这个系列的教程很多地方都是用map[string]any
类型,我觉得使用struct
来替换map
的使用,会方便很多。
3为了方便展示原博客作者选用了 GET/Param
传参的方式,而在gin-memos项目中使用的大多则是在Request Body
中传入json
的。(GET/Param
传参的方式肯定是不行的,因为url长度是有限的,文章存储的内容就有限了。)