服务端在调用第三方接口有可能会超时,如果超时了,一般不会让客户端一直等,要设置最大响应时间,如果超过这个时间的话,就返回。
代码如下所示:
package main
import (
"net/http"
"time"
)
func readDb() string {
// 200 ms
time.Sleep(200 * time.Millisecond)
return "OK"
}
func home(w http.ResponseWriter, req *http.Request) {
var resp string
// 容量设置1,类型直接设置空结构体即可
done := make(chan struct{}, 1)
go func() {
resp = readDb()
done <- struct{}{}
}()
// 阻塞在这里,哪个先返回,就那个解除阻塞
select {
case <-done:
case <-time.After(300 * time.Millisecond):
// 100ms 超时
resp = "timeout"
}
_, _ = w.Write([]byte(resp))
}
func main() {
http.HandleFunc("/", home)
_ = http.ListenAndServe("127.0.0.1:5678", nil)
}