标签:http func err fmt ctx context 使用 go
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
标签:http,func,err,fmt,ctx,context,使用,go 来源: https://www.cnblogs.com/heris/p/16222727.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。