golang gin 使用 context 实现 ioc
2023-02-18 16:39:40 时间
gin 是一个流行的 golang webserver 的框架。https://github.com/gin-gonic/gin
gin 中 HandlerFunc
(type HandlerFunc func(*Context)
) 的使用随处可见, ex. Middleware , Handler 中。
router.GET("/user/:name", func(c *gin.Context) {
name := c.Param("name")
c.String(http.StatusOK, "Hello %s", name)
})
因此,根据之前 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 类型是
// 标准库 函数
func WithValue(parent Context, key, val interface{}) Context
// gin.Context 方法
func (c *Context) Set(key string, value interface{})
- 数据取出方式不同
- 在 context 标准库中, 使用
context.Context.Value(key interface{}) interface{}
方法。 - 在 gin 中, 除了可以使用标准接口方法外, 还可以使用
gin.Context.Get(key string) interface{}
方法, 并且返回值多一个bool 类型的 exists
参数返回, 可以判断 key 值是否存在, 排除 零值 的干扰。
- 在 context 标准库中, 使用
// 标准库
db := ctx.Value("db"
// gin
// db := c.Value("db") // 实现了 Context 接口, 可以。
db, exists := c.Get("db")
if !exists {
return
}
- 使用方式不同
- 在使用标准库中, 需要将
context ioc
传入到每一个函数 或 方法中。 - 在使用 gin 时, 需要使用 gin middleware 功能, 将
gin context ioc
传入。
- 在使用标准库中, 需要将
// 标准库
//
func save(ctx context.Context) {
// ...
}
// gin
func main() {
r := gin.Default()
r.Use(GinContextIoC) // 使用 middleware 的方式在 context 中注入与传递
// ...
}
完整 demo
这是一个实现了 gin context ioc 容器的 demo
golang demo 源代码 https://tangx.in/images/post/2021/07/28/gin-context-ioc/gin-context-ioc.go
相关文章
- Linux 文件的打包压缩
- Linux 常用命令总结
- Linux 下的输入输出和重定向示例
- CentOS Linux 的安装
- Linux 中的文件简单说明
- Linux 中的内部命令和外部命令
- Debian Linux 的安装
- Arch Linux 的安装
- Linux 下搭建 Hive 环境
- Linux 下搭建 HBase 环境
- Linux 下搭建 Hadoop 环境
- Linux 下配置 hosts 并设置免密登录
- Linux 下搭建 Kafka 环境
- Linux 下指定端口开放访问权限
- Linux 下模拟制作块设备并挂载
- Jgit的使用笔记
- 利用Github Action实现Tornadofx/JavaFx打包
- 叹息!GitHub Trending 即将成为历史!
- 微软软了?开源社区讨论炸锅,GitHub CEO 亲自来答
- GitHub Trending 列表频现重复项,前后端都没去重?