golang gin 使用 context 实现 ioc
golang gin 使用 context 实现 ioc
gin 是一个流行的 golang webserver 的框架。 https://github.com/gin-gonic/gin
gin 中 HandlerFunc
(type HandlerFunc func(*Context)
) 的使用随处可见, ex. Middleware , Handler 中。
|
|
因此,根据之前 golang context 实现 IoC 容器经验, 使用 *gin.Context
作为 IoC 容器再好不过了。
标准库 context.Context
是一个接口(interface), gin.Context
是 gin 工程自己封装的的一个 struct, 并实现了该接口。 虽然如此, 在实现的的时候, 还是有一点差别。
- 存入字段方式不同
- 在 context 标准库中, 调用的是 **包函数
context.WithValue
将key,val
写入ctx
中并生成一个新的Context
- 在 gin 中, 使用的是
gin.Context
Set
方法, 原ctx
增加新字段,保持。
- 在 context 标准库中, 调用的是 **包函数
- key 的类型不同
- 在 context 标准库中, key 类型是
interface{}
, 可以存储任意类型。 - 在 gin 中, key 类型是
string
, 有所限制。
- 在 context 标准库中, key 类型是
|
|
- 数据取出方式不同
- 在 context 标准库中, 使用
context.Context.Value(key interface{}) interface{}
方法。 - 在 gin 中, 除了可以使用标准接口方法外, 还可以使用
gin.Context.Get(key string) interface{}
方法, 并且返回值多一个bool 类型的 exists
参数返回, 可以判断 key 值是否存在, 排除 零值 的干扰。
- 在 context 标准库中, 使用
|
|
- 使用方式不同
- 在使用标准库中, 需要将
context ioc
传入到每一个函数 或 方法中。 - 在使用 gin 时, 需要使用 gin middleware 功能, 将
gin context ioc
传入。
- 在使用标准库中, 需要将
|
|
完整 demo
这是一个实现了 gin context ioc 容器的 demo
- 原文链接:https://typonotes.com/posts/2021/07/28/ioc-by-gin-context/
- 本文为原创文章,转载注明出处。
- 欢迎 扫码关注公众号
Go与云原生
或 订阅网站 https://typonotes.com/ 。 - 第一时间看后续精彩文章。觉得好的话,请猛击文章右下角「在看」,感谢支持。