client := &http.Client{}
和client := http.Client{}
之间的区别是什么?两者似乎都很好。为什么Go文档(http://golang.org/pkg/net/http/)使用&http.Client{}
?
我似乎在包级别上通过地址引用不应该有任何区别。这是为了确保使用单身Client
还是其他东西?
答案 0 :(得分:2)
从语法上讲,第一个将分配Client结构,并在其上声明一个指针,而第二个将只声明一个Client值。
现在,在实现层面,由于编译器转义分析机制,没有太大区别。如果指向客户端对象的指针转义了该函数,那么无论以何种方式声明,该对象都将在堆上进行分配。如果Go编译器确定该对象是该函数的纯粹本地对象(即不转义),则可以在堆栈上声明它,无论它被声明的方式如何。
所以两种方式都可以。
现在,关于http.Client,请考虑它是一个繁重的对象:它指的是一个缓存http连接的http.Transport对象。文档说明应尽可能重用Client对象。 http.Client值实际上并不意味着要复制。
IMO,因此在对象上保留指针是更好的 style ,因为它清楚地表明该对象不是短暂的临时变量,并且更方便将其作为参数传递功能之间。