【发布时间】:2014-10-04 06:06:23
【问题描述】:
client := &http.Client{} 和 client := http.Client{} 有什么区别?两者似乎都工作正常。为什么 Go Docs(http://golang.org/pkg/net/http/) 使用 &http.Client{}?
我似乎在包级别按地址引用不应该有任何区别。这是为了确保使用单例 Client 还是什么?
【问题讨论】:
client := &http.Client{} 和 client := http.Client{} 有什么区别?两者似乎都工作正常。为什么 Go Docs(http://golang.org/pkg/net/http/) 使用 &http.Client{}?
我似乎在包级别按地址引用不应该有任何区别。这是为了确保使用单例 Client 还是什么?
【问题讨论】:
从语法上讲,第一个将分配 Client 结构,并在其上声明一个指针,而第二个将仅声明一个 Client 值。
现在,在实现层面,没有太大的区别,因为编译器逃逸分析机制。如果指向客户端对象的指针从函数中转义,则该对象将在堆上分配,无论它以何种方式声明。如果 Go 编译器确定该对象是函数的纯本地对象(即不转义),则可以在堆栈上声明它,无论它以何种方式声明。
所以这两种方式都可以正常工作。
现在,关于 http.Client,认为它是一个重对象:它指的是一个缓存 http 连接的 http.Transport 对象。文档说应尽可能重用 Client 对象。 http.Client 值并不是真的要被复制。
IMO,因此最好 style 在对象上保留一个指针,因为它清楚地表明该对象不是短暂的临时变量,并且更方便将其作为参数传递函数之间。
【讨论】: