我现在已经学习了如何向http.Request
添加带有超时的上下文。这是MWE:
package main
import (
"context"
"fmt"
"log"
"net/http"
"time"
)
const (
timeout = 700 * time.Millisecond
url = "https://twitter.com"
)
var client = http.DefaultClient
func main() {
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
req, _ := http.NewRequest("GET", url, nil) // must succeed
req = req.WithContext(ctx)
res, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
fmt.Println(res.StatusCode)
}
如果网络/ Twitter足够慢,我会根据需要得到以下输出。
2018/07/11 19:29:55 Get https://twitter.com: context deadline exceeded
但是,如何以编程方式确定最后期限是否到期? Do
上的*http.Client
方法似乎返回了一个清晰的error
“潜在的错误(context.DeadlineExceeded
),但没有暴露出来……
我真的不想依靠解析该错误的消息来检查其原因是否为context.DeadlineExceeded
。有没有其他办法?我想念什么吗?
理想情况下,我希望能够执行以下操作:
// ...
res, err := client.Do(req)
type causer interface {
error
Cause() error
}
if err, ok := err.(causer); ok && err.Cause() == context.DeadlineExceeded {
// deal with the fact that the request timed out
}
// ...