实现思路
- 使用
http.Get
发起网络请求,该操作会返回一个Response
和可能的错误。
- 使用
time.After
函数创建一个定时器通道,在指定的超时时间后发送一个值。
- 使用
select
语句监听三个通道:
- 网络请求完成的通道,用于接收网络请求的结果。
- 定时器通道,用于处理超时情况。
- 默认分支,用于处理其他异常情况,如通道关闭等。
代码示例
package main
import (
"fmt"
"net/http"
"time"
)
func main() {
url := "http://example.com"
var result *http.Response
var err error
// 创建一个用于接收网络请求结果的通道
responseCh := make(chan *http.Response, 1)
errorCh := make(chan error, 1)
// 发起网络请求,并将结果发送到相应的通道
go func() {
result, err = http.Get(url)
if err != nil {
errorCh <- err
} else {
responseCh <- result
}
}()
// 设置超时时间为5秒
timeout := time.After(5 * time.Second)
select {
case result = <-responseCh:
defer result.Body.Close()
fmt.Println("请求成功:", result.StatusCode)
case err = <-errorCh:
fmt.Println("请求出错:", err)
case <-timeout:
fmt.Println("请求超时")
default:
fmt.Println("处理其他异常情况(如通道关闭等)")
}
}