为什么`http`包需要通过地址引用?

时间:2014-10-04 06:06:24

标签: http go

client := &http.Client{}client := http.Client{}之间的区别是什么?两者似乎都很好。为什么Go文档(http://golang.org/pkg/net/http/)使用&http.Client{}

我似乎在包级别上通过地址引用不应该有任何区别。这是为了确保使用单身Client还是其他东西?

1 个答案:

答案 0 :(得分:2)

从语法上讲,第一个将分配Client结构,并在其上声明一个指针,而第二个将只声明一个Client值。

现在,在实现层面,由于编译器转义分析机制,没有太大区别。如果指向客户端对象的指针转义了该函数,那么无论以何种方式声明,该对象都将在堆上进行分配。如果Go编译器确定该对象是该函数的纯粹本地对象(即不转义),则可以在堆栈上声明它,无论它被声明的方式如何。

所以两种方式都可以。

现在,关于http.Client,请考虑它是一个繁重的对象:它指的是一个缓存http连接的http.Transport对象。文档说明应尽可能重用Client对象。 http.Client值实际上并不意味着要复制。

IMO,因此在对象上保留指针是更好的 style ,因为它清楚地表明该对象不是短暂的临时变量,并且更方便将其作为参数传递功能之间。