go的每个request都可以有一个context用于方便进行http处理。
ctx.backend()返回是一个空的ctx,其实所有的context的父类,其没有任何值,他是一棵树,类似于进程,删除父,其子也被删。
每个request都可以新建一个context,可以向里面传入值,其有个Done chanel,用于终止。
比如:
func httpDo(ctx context.Context, req *http.Request, f func(*http.Response, error) error) error {
// Run the HTTP request in a goroutine and pass the response to f.
tr := &http.Transport{}
client := &http.Client{Transport: tr}
c := make(chan error, 1)
go func() { c <- f(client.Do(req)) }()
select {
case <-ctx.Done():
tr.CancelRequest(req)
<-c // Wait for f to return.
return ctx.Err()
case err := <-c:
return err
}
}
创建子context的方法可以有,一个是有定时器,一个没有,都会返回cancel()函数用于关闭。
// WithCancel returns a copy of parent whose Done channel is closed as soon as // parent.Done is closed or cancel is called. func WithCancel(parent Context) (ctx Context, cancel CancelFunc)
// WithTimeout returns a copy of parent whose Done channel is closed as soon as // parent.Done is closed, cancel is called, or timeout elapses. The new // Context's Deadline is the sooner of now+timeout and the parent's deadline, if // any. If the timer is still running, the cancel function releases its // resources. func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)
本文深入探讨了Go语言中Context的使用方法及其在HTTP请求处理中的作用。通过实例展示了如何利用Context来管理请求的生命周期,包括创建子context、设置超时及取消请求等关键操作。
2356

被折叠的 条评论
为什么被折叠?



