gin context和官方context_1 Go语言 系列讲座:Gin+Jwt+casbin RestFul Api 后端一战到底

b6ecdf2288ea4c9c6b46414c499cc637.png

1: Gin Context 详解

标准Context

golang 1.7 中官方给出了Context实现, 尤其在Gin中 其中点是可以链式传递共享变量. 我们只所以先讲Context, 是为了大家便于理解 Gin中如何将jwt 的token ID ,以及用户ID . 保存到 自定义的context中. 或者TraceID. 这样在后面的多个Goroutine中 共享, 另外一个重点是这些都是基于 gin 中间件实现.!这样在工程中非常便利.

自定义扩展Context

import ("context")// 定义全局上下文中的键type (transCtx   struct{}userIDCtx  struct{}traceIDCtx struct{})// NewTrans 创建事务的上下文func NewTrans(ctx context.Context, trans interface{}) context.Context {return context.WithValue(ctx, transCtx{}, trans)}// FromTrans 从上下文中获取事务func FromTrans(ctx context.Context) (interface{}, bool) {v := ctx.Value(transCtx{})return v, v != nil}// NewUserID 创建用户ID的上下文func NewUserID(ctx context.Context, userID string) context.Context {return context.WithValue(ctx, userIDCtx{}, userID)}// FromUserID 从上下文中获取用户IDfunc FromUserID(ctx context.Context) (string, bool) {v := ctx.Value(userIDCtx{})if v != nil {if s, ok := v.(string); ok {return s, s != ""}}return "", false}// NewTraceID 创建追踪ID的上下文func NewTraceID(ctx context.Context, traceID string) context.Context {return context.WithValue(ctx, traceIDCtx{}, traceID)}// FromTraceID 从上下文中获取追踪IDfunc FromTraceID(ctx context.Context) (string, bool) {v := ctx.Value(traceIDCtx{})if v != nil {if s, ok := v.(string); ok {return s, s != ""}}return "", false}

NewUserID

的意思是根据 输入的用户ID 产生一个新的Context, userIDCtx为key, userID为 value 保存到 context中欧给你 并将返回的context return

在gin contxt使用自定义context.

func NewContext(c *gin.Context) context.Context {parent := context.Background()if v := GetTraceID(c); v != "" {parent = icontext.NewTraceID(parent, v)parent = logger.NewTraceIDContext(parent, GetTraceID(c))}if v := GetUserID(c); v != "" {parent = icontext.NewUserID(parent, v)parent = logger.NewUserIDContext(parent, v)}return parent}

上面的 icontext 就是我们自定义的context.

理解了这个就可以将我们自定义的context与gin 联系起来.

gin 中间件使用自定义context

return func(c *gin.Context) {var userID stringif t := xxx.GetToken(c); t != "" {id, err

理解中中间件.

很多人感觉好像中间件很高大上, 其实就是一个 next -> next 不停的递归回调而已. 所以子要return func*(c *ginContext) 返回类型 gin.HandlerFunc. 一般都是中间件, 简单理解就是执行一个动作后, 中间在加一步,向拨开洋葱一样

341ff9f4be65753e6383072f0d6bea17.png

版权声明:本文为weixin_31924507原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。