2014-10-04 75 views
1

client := &http.Client{}client := http.Client{}有什麼區別?兩者似乎都很好。 Go Docs爲什麼使用&http.Client{}爲什麼`http`包需要被地址引用?

我似乎喜歡通過地址在包級別引用應該沒有任何區別。這是爲了確保使用單身人士Client或什麼?

回答

2

在句法上,第一個將分配Client結構,並在其上聲明一個指針,而第二個將只聲明一個Client值。

現在,在執行級別上,由於編譯器轉義分析機制,沒有太大的區別。如果一個指向客戶端對象的指針轉義該函數,那麼該對象將被分配到堆上,不管它被聲明的方式如何。如果Go編譯器確定該對象純粹是函數的本地對象(即不能轉義),則可以在堆棧中聲明它,無論聲明如何。

所以這兩種方式工作正常。

現在,關於http.Client,認爲它是一個沉重的對象:它指向緩存http連接的http.Transport對象。該文檔指出應儘可能重用Client對象。一個http.Client值並不是真的要被複制。

IMO,它是因此更風格保持一個指針的對象,因爲它清楚地表明對象不是一個短暫的臨時變量,更方便把它作爲函數之間的參數。