首页>>后端>>Golang->详解Golang中Context.WithValue函数的使用教程

详解Golang中Context.WithValue函数的使用教程

时间:2023-11-29 本站 点击:0

在Golang中,可以通过Context对协程做同步,或者传递上下文变量给其他协程。这样可以避免在协程之间传递大量的变量,代码更整洁可维护。下面的例子通过WithValue传递给协程一个变量,并且通过channel在协程之间通信。

packagemainimport("context""fmt""sync")funcworker(cancelCtxcontext.Context,chchanint,wg*sync.WaitGroup){deferwg.Done()fmt.Println(fmt.Sprintf("contextvalue:%v",cancelCtx.Value("key1")))for{select{caseval:=<-ch:fmt.Println(fmt.Sprintf("readfromchvalue:%d",val))case<-cancelCtx.Done():fmt.Println("workeriscancelled")return}}}funcmain(){rootCtx:=context.Background()childCtx:=context.WithValue(rootCtx,"key1","value1")cancelCtx,cancelFunc:=context.WithCancel(childCtx)ch:=make(chanint)wg:=&sync.WaitGroup{}wg.Add(1)goworker(cancelCtx,ch,wg)fori:=0;i<10;i++{ch<-i}cancelFunc()wg.Wait()close(ch)}

输出:

contextvalue:value1readfromchvalue:0readfromchvalue:1readfromchvalue:2readfromchvalue:3readfromchvalue:4readfromchvalue:5readfromchvalue:6readfromchvalue:7readfromchvalue:8readfromchvalue:9workeriscancelled

在实际的生产环境中,比如web服务器http请求处理器中,可以通过WithValue传递通用的字段给请求处理协程,比如用于多个请求之间的链路追踪:

packagemainimport("context""fmt""net/http""github.com/google/uuid")funcwelcome(whttp.ResponseWriter,r*http.Request){traceid:=""ifm:=r.Context().Value("traceid");m!=nil{ifvalue,ok:=m.(string);ok{traceid=value}}w.Header().Add("traceid",traceid)w.Write([]byte("WelcometoChina"))}functraceID(nexthttp.Handler)http.Handler{returnhttp.HandlerFunc(func(whttp.ResponseWriter,r*http.Request){traceid:=uuid.New().String()ctx:=context.WithValue(r.Context(),"traceid",traceid)req:=r.WithContext(ctx)next.ServeHTTP(w,req)})}funcmain(){welcomeHandler:=http.HandlerFunc(welcome)http.Handle("/welcome",traceID(welcomeHandler))http.ListenAndServe(":9090",nil)}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/Golang/218.html