学习 Gin 问题总结 2020.12.29
学习 Gin 问题总结 2020.12.29
数据绑定与解析
BindXXX
,ShouldBindXXX
和ShouldBindWith
区别
BindXXX
会自动返回信息,输入无效时,在
header
写入400。ShouldBindXXX
返回消息,输入无效时,不会在
header
写入400状态码,这时候可以自定义返回信息,在使用上相对来说更加灵活。ShouldBindWith
在
gin
1.4 之前,重复使用ShouldBind
绑定会报错EOF
。gin
1.4 之后官方提供了一个ShouldBindBodyWith
的方法,可以支持重复绑定,原理就是将body
的数据缓存了下来,但是二次取数据的时候还是得用ShouldBindBodyWith
才行,直接用ShouldBind
还是会报错的。根据方法内参数
b
的类型去绑定json
,query
,去绑定obj
,不返回状态码。
func (c *Context) ShouldBindWith(obj interface{}, b binding.Binding) error {
return b.Bind(c.Request, obj)
}
HTML渲染
func main() {
// 1.创建路由
r := gin.Default()
//静态文件,声明模板文件所在的目录,系统自动解析
r.LoadHTMLGlob("static/html/*")
...
}
LoadHTMLGlob()
,该方法参数内的目录下,不能有二级目录,存在二级目录将会panic
。
而且该方法只能在一个实例中对一个目录使用一次(使用过的目录下的子目录同样是为已使用)。
使用两次
//静态文件,声明模板文件所在的目录,系统自动解析
r.LoadHTMLGlob("static/html/*")
r.LoadHTMLGlob("static/html/html2/*")
将会:
panic: read static\html\html2: The handle is invalid.
如果需要解析两个目录下的HTML
文件,可在同一目录下创建两个文件夹:
//静态文件,声明模板文件所在的目录,系统自动解析
r.LoadHTMLGlob("static/html/*")
r.LoadHTMLGlob("static/html2/*")
[GIN-debug] Loaded HTML Templates (4):
- form.html
- login.html
- upload.html
-[GIN-debug] Loaded HTML Templates (2):
- uploadMore.html
-
此时将会正常解析两个目录下的HTML
模板。
还可以使用:
//静态文件,声明模板文件所在的目录,系统自动解析
r.LoadHTMLGlob("static/**/*")
-[GIN-debug] Loaded HTML Templates (5):
- form.html
- login.html
- upload.html
- uploadMore.html
static
目录下的子目录内的所有模板文件都将被解析。
注意:static
目录下的模板文件将不会被解析。
重定向
c.Redirect(http.StatusPermanentRedirect,"http://localhost:8080/updateBook")
状态码可选:
http.StatusPermanentRedirect //永久性重定向
http.StatusTemporaryRedirect //临时性重定向
第二个参数为重定向的地址。
异步处理
// Async 异步处理,保存上传文件,开启相应数量的 goroutine
func Async(c *gin.Context) {
form, err := c.MultipartForm()
if err != nil {
c.String(http.StatusBadRequest,fmt.Sprintf("get err %s",err.Error()))
}
//根据key:‘files’,获取表单中的文件切片
files := form.File["files"]
fileSum := len(files)
fileName := make([]string,fileSum)
//控制上传文件同步问题处理
waitG := sync.WaitGroup{}
waitG.Add(fileSum)
for index, file := range files {
fileName[index] = file.Filename
//异步处理时,上下文应该复制一个只读副本,不直接使用原始上下文
cc := c.Copy()
go func(c *gin.Context,fileName string,fileUpload *multipart.FileHeader) {
defer waitG.Done()
fmt.Println("正在保存",fileName)
cc.SaveUploadedFile(fileUpload,fileName)
}(cc,fileName[index],file)
}
waitG.Wait()
c.String(http.StatusOK,"%s",strings.Join(fileName,",\n"))
}
初始写法(错误):
go func() {
defer waitG.Done()
fmt.Println("正在保存",fileName[index])
cc.SaveUploadedFile(file,fileName[index])
}()
}
错误原因总结:
未进行传参,导致只有最后一个文件被上传,通过debug
发现,虽然已经做同步处理(使用WaitGroup
),但是goroutine
内因为延迟求值的原因,导致每次都只是保存最后一个文件。传入参数fileName
、fileUpload
后,会立即复制参数,不会出现延迟求值的情况,使得保存文件按顺序进行保存。
学习 Gin 问题总结 2020.12.29的更多相关文章
- 学习 Gin 总结(2020.12.30-31)
2020.12.30 问题总结 中间件 context.Next() 源码注释: // Next should be used only inside middleware. // It execut ...
- 2015.12.29~2015.12.30真题回顾!-- HTML5学堂
2015.12.29~2015.12.30真题回顾!-- HTML5学堂 吃饭,能够解决饥饿,提供身体运作机能.练习就像吃饭,强壮自己,提升编程技能,寻求编程技巧的最佳捷径!吃饭不能停,练习同样不能停 ...
- Qt 学习之路 2(12):菜单栏、工具栏和状态栏
Home / Qt 学习之路 2 / Qt 学习之路 2(12):菜单栏.工具栏和状态栏 Qt 学习之路 2(12):菜单栏.工具栏和状态栏 豆子 2012年9月10日 Qt 学习之路 2 2 ...
- OpenWrt(LEDE)2020.4.29更新 UPnP+NAS+多拨+网盘+DNS优化+帕斯沃 无缝集成+软件包
交流群:QQ 1030484865 电报: t_homelede 固件说明 基于Lede OpenWrt R2020.4.8版本(源码截止2020.4.29)Lienol Feed及若干自行维护 ...
- [源码解析] 深度学习分布式训练框架 horovod (12) --- 弹性训练总体架构
[源码解析] 深度学习分布式训练框架 horovod (12) --- 弹性训练总体架构 目录 [源码解析] 深度学习分布式训练框架 horovod (12) --- 弹性训练总体架构 0x00 摘要 ...
- 2020.12.12【NOIP提高B组】模拟 总结
第一次来 B 组做,虚的很 T1: 容斥原理 比赛时也打了个大致,但挂了,只有 50 分. 赛后重构了一下代码,AC \(UPDATE:2020/12/13\ \ \ 14:10\) 思路: 像前缀和 ...
- 2020/12/9 酒etf
2020/12/9 2.315建仓酒etf,之后陆续加仓,拿到年底看看 2020/12/12 2.36卖出部分,目前成本2.106,盈利百分之9.449,白酒应该是没问题,但感觉年前应该有波调整. 2 ...
- 2020/1/29 PHP代码审计之进一步学习XSS【持续更新】
0x00 上午学习了XSS漏洞,中午吃饭想了想,还是思考的太浅层了,这种老生常谈的东西对于现在的我意义不大.现在我需要的是思考.于是就有了这个随笔.在本文中,我会持续更新一些XSS的深入思考,payl ...
- java学习第七天2020/7/12
一. java继承使用的关键字是 extend class 子类 extends 父类{} 举一个类的例子: public class person { public String name; pu ...
随机推荐
- 第15.37节 PyQt(Python+Qt)入门学习:containers容器类部件QMdiArea多文档界面部件详解及编程开发案例
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.引言 老猿在前期学习PyQt相关知识时,对每个组件的属性及方法都研 ...
- 第8.34节 《Python类中常用的特殊变量和方法》总结
本章介绍了Python类中常用的特殊变量和方法,这些特殊变量和方法都有特殊的用途,是Python强大功能的基石之一,许多功能非常有Python特色.由于Python中一切皆对象,理解这些特殊变量和方法 ...
- PyQt(Python+Qt)学习随笔:Mode/View中的枚举类 QItemSelectionModel.SelectionFlag取值及含义
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 以上取值可以通过或操作进行组合使用. 老猿Python,跟老猿学Python! 老猿Python博文 ...
- 第15.25节 PyQt(Python+Qt)入门学习:Model/View开发实战--使用QTableView展示Excel文件内容
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 在前面的订阅专栏<第十九章.Model/View开发:QTableView的功能及属 ...
- 【开发工具】 使用 Postman 进行接口测试 (配置全局 token,JWT可用)
在前后端分离开发的项目中,使用postman来做接口测试会方便很多,然而因为JWT的鉴权,导致每半小时token都要更新一下,使测试变的很麻烦. 如果把token设置为全局变量,方便做测试,每次自动获 ...
- 跨国合作:Serverless Components 在腾讯云的落地和实践
导语 | Serverless Components 是 Serverless Framework 推出的最新解决⽅案,具有基础设施编排能⼒,开发者通过使⽤ Serverless Components ...
- Scrum 冲刺 第三篇
Scrum 冲刺 第三篇 每日会议照片 昨天已完成工作 队员 昨日完成任务 黄梓浩 继续完成app项目架构搭建 黄清山 完成部分个人界面模块数据库的接口 邓富荣 完成部分后台首页模块数据库的接口 钟俊 ...
- 优化 Webpack 的构建速度
1.使用高版本的 Webpack 和 Node.js 2.多进程/多实例构建:HappyPack(不维护了).thread-loader 3.压缩代码 webpack-paralle-uglify-p ...
- javascript中 fn() 和 return fn() 的区别
在js中用return和不用return,输出结果有的时候傻傻搞不清,之前在网上看到个例子挺经典,不过讲的不清楚,上例子: var i = 0; function fn(){ i++; if ...
- P4085 [USACO17DEC]Haybale Feast
我又开始水了,感觉又是一道虚假的蓝题 题意 非常好理解,自己看吧 题解 可以比较轻易的发现,如果对于一段满足和大于等于 \(m\) 的区间和其满足和大于等于 \(m\) 的子区间来说,选择子区间肯定是 ...