go 的context 使用
2022/5/4 23:43:47
本文主要是介绍go 的context 使用,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1, context.WithCancel
package main import ( "context" "fmt" "time" ) func main() { test() time.Sleep(time.Second * 5) } func test() { ctx, cancel := context.WithCancel(context.Background()) defer cancel() intChan := goroute(ctx) for n := range intChan { fmt.Println(n) if n == 5 { break } } } func goroute(ctx context.Context) <-chan int { chanInt := make(chan int) n := 1 go func() { for { select { case <-ctx.Done(): fmt.Println("exited") return case chanInt <- n: n++ } } }() return chanInt }
输出:
1 2 3 4 5 exited
2, context.WithTimeout
package main import ( "context" "fmt" "io/ioutil" "net/http" "time" ) type Result struct { resp *http.Response err error } func main() { process() } func process() { ctx, cancel := context.WithTimeout(context.Background(), time.Second*2) defer cancel() tr := &http.Transport{} client := &http.Client{Transport: tr} chanResp := make(chan Result, 1) req, err := http.NewRequest("GET", "http://www.google.com", nil) if err != nil { fmt.Println("请求失败,err:", err) return } go func() { resp, err := client.Do(req) pack := Result{ resp: resp, err: err, } chanResp <- pack }() select { case <-ctx.Done(): tr.CancelRequest(req) res := <-chanResp fmt.Println("请求超时,err:", res.err) case res := <-chanResp: defer res.resp.Body.Close() out, _ := ioutil.ReadAll(res.resp.Body) fmt.Println("请求成功:") fmt.Println(out) } }
输出:
请求超时,err: Get "http://www.google.com": net/http: request canceled while waiting for connection
3, context.WithValue
package main import ( "context" "fmt" ) func main() { ctx := context.WithValue(context.Background(), "trace_id", 12345678) ctx = context.WithValue(ctx, "session", "asdfjladjf") process(ctx) } func process(ctx context.Context) { ret, ok := ctx.Value("trace_id").(int) if !ok { fmt.Println("获取ctx的trace_id失败") return } fmt.Println("获取ctx的trace_id:", ret) s, _ := ctx.Value("session").(string) fmt.Println("获取ctx的session:", s) }
输出:
获取ctx的trace_id: 12345678 获取ctx的session: asdfjlad
这篇关于go 的context 使用的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-12Cargo deny安装指路
- 2024-11-02MongoDB项目实战:从入门到初级应用
- 2024-11-01随时随地一键转录,Google Cloud 新模型 Chirp 2 让语音识别更上一层楼
- 2024-10-25Google Cloud动手实验详解:如何在Cloud Run上开发无服务器应用
- 2024-10-24AI ?先驱齐聚 BAAI 2024,发布大规模语言、多模态、具身、生物计算以及 FlagOpen 2.0 等 AI 模型创新成果。
- 2024-10-20goland工具下,如修改一个项目的标准库SDK的版本-icode9专业技术文章分享
- 2024-10-17Go学习:初学者的简单教程
- 2024-10-17Go学习:新手入门完全指南
- 2024-10-17Golang学习:初学者入门教程
- 2024-10-17Golang学习:新手入门教程