• [GO]conext的使用


    package main
    
    import (
        "context"
        "time"
        "net/http"
        "fmt"
        "io/ioutil"
    )
    
    type Result struct {
        r *http.Response
        err error
    }
    
    func process() {
        ctx,cancel := context.WithTimeout(context.Background(), 2*time.Second)
        defer cancel()
    
        tr := &http.Transport{}
        client := &http.Client{Transport:tr}
        c := make(chan Result, 1)
        req, err := http.NewRequest("GET", "http://google.com", nil)
        if err != nil{
            fmt.Println("http request filed, err:", err)
            return
        }
        go func() {
            resp, err := client.Do(req)
            pack := Result{r:resp, err:err}
            c <- pack
        }()
    
        select {
        case <- ctx.Done()://内部也是一个管道,如果这个管道能够读到数据,说明已经超时了
            tr.CancelRequest(req)//取消正在请求的http请求
            res := <-c
            fmt.Println("timeout!", res.err)
        case res := <-c:
            defer res.r.Body.Close()
            out, _ := ioutil.ReadAll(res.r.Body)
            fmt.Printf("server response:%s", out)
        }
        return
    }
    
    func main() {
        process()
    }

    执行结果 

    timeout! Get http://google.com: net/http: request canceled while waiting for connection
  • 相关阅读:
    求最大子数组02
    求最大子数组
    第3周学习进度
    四则运算3
    第2周学习进度
    构建之法阅读笔记02
    四则运算2及单元测试
    四则运算1
    第1周学习进度
    构建之法阅读笔记01
  • 原文地址:https://www.cnblogs.com/baylorqu/p/9993798.html
Copyright © 2020-2023  润新知