• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

go官方的http.request + context样例

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

go官方的http.request + context样例

https://github.com/DavadDi/go_study/blob/master/src/httpreq_context/main.go

package main

import (
	"context"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"time"
)

func HttpDoTest(ctx context.Context, resChan chan<- string) error {
	start := time.Now()

	repoUrl := "https://api.github.com/repos/campoy/golang-plugins"
	req, err := http.NewRequest("GET", repoUrl, nil)
	if err != nil {
		return fmt.Errorf("http.NewRequest Error: %s", err.Error())
	}

	// in go >= 1.7
	req = req.WithContext(ctx)

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		return fmt.Errorf("client.Do Error: %s", err.Error())
	}

	data, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return fmt.Errorf("ioutil.ReadAll Error: %s", err.Error())
	}

	log.Printf("Read body size [%d]", len(data))
	log.Println("CostTime is: " + time.Since(start).String())

	resChan <- string(data)

	return nil
}

func main() {
	deadline := 1
	d := time.Now().Add(time.Duration(deadline) * time.Second) // deadline max
	ctx, cancel := context.WithDeadline(context.Background(), d)
	defer cancel()

	resChan := make(chan string)

	go HttpDoTest(ctx, resChan)

	var resData string
	select {
	case <-ctx.Done():
		fmt.Println(ctx.Err())

		/* just for ex use. No used*/
	case <-time.Tick(time.Duration(time.Duration(deadline*2) * time.Second)):
		fmt.Println("Time over!")

	case resData = <-resChan:
		fmt.Println("Read data finished")
	}

	log.Printf("Read data size: [%d]", len(resData))
}

  

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Go读取文件发布时间:2022-07-10
下一篇:
go语法专题:空接口,反射,空结构体,断言,泛型发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap