设置超时的另外一种方法

这小节将介绍另外一种从客户端处理 HTTP 连接超时的方法。如您所见,这是最简单的超时处理形式,因为您只需要定义一个 http.Client 对象并设置它的 Timeout 字段为期望的超时值。

展示最后一种超时类型的程序命名为 anotherTimeOut.go,并分为四个部分来介绍。

anotherTimeOut.go的第一部分如下:

  1. package main
  2. import (
  3. "fmt"
  4. "io"
  5. "net/http"
  6. "os"
  7. "strconv"
  8. "time"
  9. )
  10. var timeout = time.Duration(time.Second)

anotherTimeOut.go 的第二部分代码如下:

  1. func main() {
  2. if len(os.Args) == 1 {
  3. fmt.Println("Please provide a URL")
  4. return
  5. }
  6. if len(os.Args) == 3 {
  7. temp, err := strconv.Atoi(os.Args[2])
  8. if err != nil {
  9. fmt.Println("Using Default Timeout!")
  10. } else {
  11. timeout = time.Duration(time.Duration(temp) * time.Second)
  12. }
  13. }
  14. URL := os.Args[1]

anotherTimeOut.go 的第三部分代码如下:

  1. client := http.Client{
  2. Timeout: timeout,
  3. }
  4. client.Get(URL)

这是使用 http.Client 变量的 Timeout 字段定义超时周期的地方。

anotherTimeOut.go 的最后一段代码如下:

  1. data, err := client.Get(URL)
  2. if err != nil {
  3. fmt.Println(err)
  4. return
  5. } else {
  6. defer data.Body.Close()
  7. _, err := io.Copy(os.Stdout, data.Body)
  8. if err != nil {
  9. fmt.Println(err)
  10. return
  11. }
  12. }
  13. }

执行 anotherTimeOut.go 并和在第十章(Go 并发-进阶讨论)开发的 slowWWW.go web 服务器交互,将产生如下输出:

  1. $ go run anotherTimeOut.go http://localhost:8001
  2. Get http://localhost:8001: net/http: request canceled (Client.Timeout exceeded while awaiting headers)
  3. $ go run anotherTimeOut.go http://localhost:8001 15
  4. Serving: /
  5. Delay: 8