1 回答

TA貢獻1934條經(jīng)驗 獲得超2個贊
您的兩個示例都可以正常工作。另請注意,除了new()
,您還可以使用復合文字并獲取其地址,如下所示:
var?wg?=?&sync.WaitGroup{}
方法有指針接收者,所以無論何時調(diào)用它的方法,都需要結(jié)構(gòu)值sync.WaitGroup
的地址。WaitGroup
這不是問題,因為 whenwg
是非指針,wg.Add(1)
and調(diào)用是andwg.Done()
的簡寫,因此編譯器會自動“重寫”那些調(diào)用以獲取first 的地址,并將該地址用作方法的接收者。(&wg).Add(1)
(&wg).Done()
wg
但是,我仍然認為,如果一個值僅用作指針(sync.WaitGroup
這是一個很好的例子),您應該首先聲明它并將其作為指針使用,這樣可以減少出錯的空間。
例如,如果你使用一個非指針并且你聲明函數(shù)期望一個非指針,并且你將它作為一個非指針傳遞,你不會得到編譯時錯誤,但它會行為不端(不應該被sync.WaitGroup
復制).
盡管今天的 linter 會給你一條警告信息,但我仍然認為最好始終使用指針。
使用指針的另一個原因:如果一個函數(shù)將返回一個sync.WaitGroup
,或者如果您有一個存儲sync.WaitGroup
為值的映射,您將無法對結(jié)果調(diào)用方法,因為函數(shù)的返回值和映射索引操作是不可尋址的。如果該函數(shù)將返回一個指針值,或者如果您首先將指針存儲在映射中,您仍然可以調(diào)用這些方法而不必將它們存儲在局部變量中。
例如:
func getWg() sync.WaitGroup { return sync.WaitGroup{} }
getWg().Wait() // Compile-time error!
m := map[int]sync.WaitGroup{
? ? 1: sync.WaitGroup{},
}
m[1].Wait() // Again: compile-time error
但是這些工作:
func getWg() *sync.WaitGroup { return &sync.WaitGroup{} }
getWg().Wait() // Works, you can call methods on the return value
m := map[int]*sync.WaitGroup{
? ? 1: &sync.WaitGroup{},
}
m[1].Wait() // Also works
- 1 回答
- 0 關注
- 157 瀏覽
添加回答
舉報