# 12.10.3 设置超时的另外一种方法

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

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

`anotherTimeOut.go`的第一部分如下：

```go
package main

import (
    "fmt"
    "io"
    "net/http"
    "os"
    "strconv"
    "time"
)

var timeout = time.Duration(time.Second)
```

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

```go
func main() {
    if len(os.Args) == 1 {
        fmt.Println("Please provide a URL")
        return
    }

    if len(os.Args) == 3 {
        temp, err := strconv.Atoi(os.Args[2])
        if err != nil {
            fmt.Println("Using Default Timeout!")
        } else {
            timeout = time.Duration(time.Duration(temp) * time.Second)
        }
    }

    URL := os.Args[1]
```

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

```go
    client := http.Client{
        Timeout: timeout,
    }
    client.Get(URL)
```

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

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

```go
    data, err := client.Get(URL)
    if err != nil {
        fmt.Println(err)
        return
    } else {
        defer data.Body.Close()
        _, err := io.Copy(os.Stdout, data.Body)
        if err != nil {
            fmt.Println(err)
            return
        }
    }
}
```

执行 `anotherTimeOut.go` 并和在[第十章](https://github.com/hantmac/Mastering_Go_ZH_CN/tree/master/eBook/chapter10/10.0.md)（Go 并发-进阶讨论）开发的 `slowWWW.go` web 服务器交互，将产生如下输出：

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