Go网络开发中的两个技术点

栏目: Go · 发布时间: 6年前

内容简介:最近碰到群里网友问如果检查网络连接的Timeout,联想最近看到的另一个问题, 在这篇文章统一记录一下。自 Go 1.6开始, 所有的超时导致的网络错误都可以通过更早版本的Go并没有专门的检查Timeout方法。

最近碰到群里网友问如果检查网络连接的Timeout,联想最近看到的另一个问题, 在这篇文章统一记录一下。

如果检查一个网络错误是Timeout导致的?

Go 1.6开始, 所有的超时导致的网络错误都可以通过 net.ErrorTimeout() 方法检查。

if err, ok := err.(net.Error); ok && err.Timeout() {
    ……
}

更早版本的Go并没有专门的检查Timeout方法。

可以参考: https://stackoverflow.com/questions/23494950/specifically-check-for-timeout-error

产品中一定不要使用默认的 http.Get

如果你觉得方便,直接使用 http.Get 或者类似的方法发送请求,可能会导致一些问题, 因为这默认是使用 DefaultClient 作为client:

DefaultClient

一个具体的使用默认的client导致的问题可以参考 Don’t use Go’s default HTTP client (in production)

所以Go开发过程中最好使用自己定制的Client:

var timeout = time.Duration(2 * time.Second)

func dialTimeout(network, addr string) (net.Conn, error) {
    return net.DialTimeout(network, addr, timeout)
}

func main() {
    transport := http.Transport{
        Dial: dialTimeout,
        Proxy: ...,
        MaxIdleConns: ...,
        MaxIdleConnsPerHost: ...,
        IdleConnTimeout: ...,
        ResponseHeaderTimeout: ...,
        DisableCompression:...,
    }

    client := http.Client{
        Transport: &transport,
    }

    resp, err := client.Get("http://some.url")
}

酌情设置 Transport 的参数。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Alone Together

Alone Together

Sherry Turkle / Basic Books / 2011-1-11 / USD 28.95

Consider Facebookit’s human contact, only easier to engage with and easier to avoid. Developing technology promises closeness. Sometimes it delivers, but much of our modern life leaves us less connect......一起来看看 《Alone Together》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试