2 回答
TA贡献1844条经验 获得超8个赞
这是一种更简单的方法:
var Client *http.Client= &http.Client{
Timeout: time.Second * 30,
Transport: &http.Transport{
Dial: (&net.Dialer{
Timeout: 30 * time.Second,
KeepAlive: 30 * time.Second,
}).Dial,
TLSHandshakeTimeout: 10 * time.Second,
},
}
}
您不需要单独的初始化函数来初始化变量。
TA贡献1824条经验 获得超6个赞
如果您只从一个 goroutine调用,您的解决方案会创建一个http.Client实例。getClient()
如果你从多个 goroutine 调用它,那么它就是一个数据竞争,因此是未定义的行为。
您可以将您的client作为包初始化的一部分进行初始化,如果您从那时起只阅读它,您将是安全的:
var client = getClient()
如果您不能或不想这样做,请稍后再初始化您的clientusing sync.Once,您可以安全地同时使用:
var (
once sync.Once
client *http.Client
)
func initClient() {
once.Do(func() {
client = &http.Client{
Timeout: time.Second * 30,
Transport: &http.Transport{
Dial: (&net.Dialer{
Timeout: 30 * time.Second,
KeepAlive: 30 * time.Second,
}).Dial,
TLSHandshakeTimeout: 10 * time.Second,
},
}
})
}
- 2 回答
- 0 关注
- 251 浏览
添加回答
举报
