dmi*_*ael 30

要添加到Volker的答案,如果除了连接超时之外还要设置读/写超时,您可以执行以下操作

package httpclient

import (
    "net"
    "net/http"
    "time"
)

func TimeoutDialer(cTimeout time.Duration, rwTimeout time.Duration) func(net, addr string) (c net.Conn, err error) {
    return func(netw, addr string) (net.Conn, error) {
        conn, err := net.DialTimeout(netw, addr, cTimeout)
        if err != nil {
            return nil, err
        }
        conn.SetDeadline(time.Now().Add(rwTimeout))
        return conn, nil
    }
}

func NewTimeoutClient(connectTimeout time.Duration, readWriteTimeout time.Duration) *http.Client {

    return &http.Client{
        Transport: &http.Transport{
            Dial: TimeoutDialer(connectTimeout, readWriteTimeout),
        },
    }
}

此代码已经过测试并正在生产中.有关测试的完整要点,请访问 https://gist.github.com/dmichael/5710968

conn.SetDeadlinetime.Now()
  • 此超时不适用于keepalive连接,这是默认设置,也是我想象的大多数人应该使用的连接.以下是我提出的解决这个问题的方法:http://gist.github.com/seantalts/11266762 (3认同)