在使用ContextWithValue时,我将UUID传递给处理此*http.request的后续函数.此uuid在授权头中传递给睡觉调用以识别人员.验证授权令牌,并且需要对其进行访问以判断调用本身是否经过授权.

我用过:

ctx := context.WithValue(r.Context(), string("principal_id"), *id)

但戈林特抱怨道:

should not use basic type string as key in context.WithValue

可用于检索不是简单字符串等基本类型的此键的最佳选项是什么?

推荐答案

只需使用密钥类型:

type key int

const (
    keyPrincipalID key = iota
    // ...
)

因为您定义了一个单独的类型,所以它永远不会冲突.即使你有两个包裹,pkg1.key(0) != pkg2.key(0)个.

另请参阅:Go Blog about key collisions in context.

Go相关问答推荐

禁用Golang中的终端

如何在gofiber/websocket/v2中设置状态代码和原因

我可以在Golang中的另一个类型参数的基础上约束一个类型的参数吗?

Go 1.20 中如何计算连接错误?

将这两个函数合二为一的惯用方法

我可以扫描表中每个项目的最高范围键值吗?

未实现的 desc = 未知服务 pb.AuthService 我的简单身份验证服务器上出现错误

从 ApiGateway 中的 lambda Go 返回 Json

如何将已知类型转换为指向switch 中类型参数的指针?

Github Actions Go lambda 项目不同的 sha256sums

Golang:如何在不转义每个动作的情况下呈现模板的模板?

如何在 Golang 中打印 2 列表?

具有两个或多个模型的 GORM 查询

Golang 构建多平台问题

Go 加密库创建的 PKCS1 公钥与openssl rsa ...之间的区别

GoLang 遍历 yaml 文件

处理程序中的无限循环

comparable和any有什么区别?

Gin中测试模式有什么用

Golang 中的无实体函数