package main import ( "net/http" "sync" "time" ) func main() { req, err := http.NewRequest("GET", "http://qq.com", nil) check(err) ch := make(chan struct{}) req.Cancel = ch var closeOnce sync.Once cancel := func() { closeOnce.Do(func() { close(ch) }) } timer := time.AfterFunc(time.Second*20, func() { cancel() }) timer.Reset(time.Second * 30) // 重设超时 cancel() // 手工取消 } func check(err error) { if err != nil { panic(err) } }