【问题标题】:Why does the `http` package need to be referenced by address?为什么`http`包需要地址引用?
【发布时间】:2014-10-04 06:06:23
【问题描述】:

client := &http.Client{} 和 client := http.Client{} 有什么区别?两者似乎都工作正常。为什么 Go Docs(http://golang.org/pkg/net/http/) 使用 &http.Client{}?

我似乎在包级别按地址引用不应该有任何区别。这是为了确保使用单例 Client 还是什么?

【问题讨论】:

    标签: http go


    【解决方案1】:

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

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

    所以这两种方式都可以正常工作。

    现在,关于 http.Client,认为它是一个重对象:它指的是一个缓存 http 连接的 http.Transport 对象。文档说应尽可能重用 Client 对象。 http.Client 值并不是真的要被复制。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-02
      • 2015-11-28
      • 2021-05-23
      • 1970-01-01
      • 2022-07-03
      • 1970-01-01
      相关资源
      最近更新 更多