Gin Context
CONTEXT CREATION
用来重置或者复制一个Context
<b>reset()</b>
<b>将现有Context的绝大多数字段全部重置为初始值</b>
<b>Copy()</b>
拷贝一个当前的Context,提供给其他协程使用
handlers,skippedNodes,errors等不会被复制,在使用时需要注意
Index会被直接设置为abort的值,也就意味着,这个Context实际上是没有办法向下继续执行的。
FLOW CONTROL
控制流,我们常用的Next和Abort就在这一模块
<b>Next()</b>
通过Index来确定当前需要执行的handler,<b>这里会和中间件联动</b>
<b>Abort()</b>
直接将Index设置到abort的状态,后续方法也不会再执行了
ERROR MANAGEMENT
错误管理
Error()
该方法会把err信息装到Context的Errors切片中,非常适合中间件使用
使用方最终可以将Errors的错误信息全部写进日志中
注意他返回的Error是gin框架中自定义的错误
METADATA MANAGEMENT
元数据管理,就是Key中存储的数据,gin帮我做了一套数据转化的方法,直接获取我们需要的字段类型
Set() 向一个带锁的MAP中写入一个值的经典写法 ,值得学习
该方法被用在两个地方
从Pool中获取一个新的Context时
需要重置当前Context时
Get()
MustGet() 唯一特殊的方法。查找的键值不存在,直接Panic。
其他 一套获取指定类型的方法,核心就是反射,没啥技巧
注意,我们仍然可以调用delete()方法删掉一个元数据,因为他的底层是个MAP
INPUT DATA
获取用户输入的数据,看着一大堆实际上<b>关键函数</b>就几个我们后续会展开
Param() 获取动态参数的方法。
GetQueryArray() 获取URL参数的核心方法,其他方法都是基于此方法。
GetPostFormArray() 获取Form表单的核心方法,其他方法都是基于此方法。
get() 获取MAP类型返回值的核心方法,不常用。
ShouldBindWith() 绝大多数bind方法的核心。后续我们专门展开讲一讲。
RESPONSE RENDERING
返回内容,主要是设置response的header和body
Header() 用来设置一些头部信息。
SetCookie() 底层是http.SetCookie的封装。
Render() 其他返回方法的底层方法。我们常用的json,jsonp,html都是基于这个方法实现的。
File() 返回一个文件,实现下载功能时会用到。
Stream() gin 理论上确实可以返回一个数据流,只是用的很少。
CONTENT NEGOTIATION
用来和客户端协商请求的响应格式的。有些时候客户端会带上需要的返回内容,XML或者Json。
Negotiate() 根据客户端的需求,返回恰当的类型。非常智能,但用的很少。
GOLANG.ORG/X/NET/CONTEXT
对官方Context接口的具体实现,我们可以细细品一品。