杜松子酒:什么是 gin.Context.Keys

gin golang: what is gin.Context.Keys

我尝试使用 go-gin 框架中的方法 context.GetBool (here) 和一些查询参数。 它没有正常工作,我认为 Context.Keys 没有被查询参数填充。

所以我的问题是:什么是 gin.Context.Keys,发出请求时应该如何填充它?

PS: 这个问题已经被问过 here,但是没有正确的答案。

tl;dr Keys 字段支持 Gin 的上下文实现 context.Context 接口作为请求范围的 key/value 载体.


I think the Context.Keys is not populated by query params.

正确。 Context.Keys 与查询参数无关。查询参数可用于 Context.Query.

关于Keys相反,关于struct字段的文档是这样写的:

Keys is a key/value pair exclusively for the context of each request.

并且这些 key/value 对可以通过 Get and Set 访问。后一个的文档是:

Set is used to store a new key/value pair exclusively for this context. It also lazy initializes c.Keys if it was not used previously.

因此该字段类似于 context 包的 Context.WithValueContext.Value,例如请求范围参数。 Gin 的上下文 Keys 是存储原始 key/value 对的导出映射。 GetBool 等方法很方便,因为您不必自己键入断言 interface{} 值。

与其他web框架不同的是,Gin的Context没有包装一个context.Context值(c.Request.Context除外),而是直接实现接口。这包括 Value 方法本身,它也访问基础 Keys 字段。

顺便说一下,与标准库 context 实现的一个重要区别是 context.Context 接受 interface{} 键,而 Gin 的上下文仅接受 string 键。