作用
参考:https://lailin.xyz/post/go-training-week3-context.html
- 在多个goroutine中设置截止日期、同步信号、传递请求相关值的
- 设置截止日期,或进行超时控制,deadline()
- 同步信号,done()
- 传递请求相关值,value()
- 注意点
- 下层的context cancel不会引起上层的context的cancel
- 参考:https://www.jianshu.com/p/dabd196374b9
- 下层的context cancel不会引起上层的context的cancel
是什么
上下文
组成
type Context interface {
Deadline() (deadline time.Time, ok bool)
Done() <-chan struct{}
Err() error
Value(key interface{}) interface{}
}
- deadline
- 返回的第一个值是 截止时间,到了这个时间点,Context 会自动触发 Cancel 动作。返回的第二个值是 一个布尔值,true 表示设置了截止时间,false 表示没有设置截止时间,如果没有设置截止时间,就要手动调用 cancel 函数取消 Context
- done
- 返回一个只读的通道(只有在被cancel后才会返回),类型为 struct{}。当这个通道可读时,意味着parent context已经发起了取消请求,根据这个信号,开发者就可以做一些清理动作,退出goroutine
- err
- 返回 context 被 cancel 的原因
- value
- 返回被绑定到 Context 的值,是一个键值对,所以要通过一个Key才可以获取对应的值,这个值一般是线程安全的
存在原因
协程关闭原因
- goroutine自己跑完
- 正常结束
- 主进程crash,goroutine被迫退出
- 异常关闭,需要优化代码
- 通过通道信号,引导协程关闭
- 开发者手动控制
gin.context和context.context区别
- 参考:https://www.coder.work/article/1025918
- gin.context实现了context.context接口
- gin.context里面包含
- request请求头
- writer响应
- params参数
- keys,自定义参数
- error,错误信息
- accepted,设置动态响应格式