第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

多個 sync.WaitGroup 用法

多個 sync.WaitGroup 用法

Go
慕尼黑的夜晚無繁華 2023-05-15 15:38:16
我見過幾個不同的例子sync.WaitGroup示例 1var wg sync.WaitGroupwg.Add(1)go doStuff(&wg)wg.Wait()示例 2wg := new(sync.WaitGroup)wg.Add(1)go doStuff(wg)wg.Wait()區(qū)別在于sync.WaitGroup初始化 方式var與new如果使用該var選項,它必須作為&wg指向 goroutine 的指針傳遞,但如果我使用該new選項,我可以將其發(fā)送為wg這兩個例子有什么區(qū)別?以上2個哪一個是正確的?在某些情況下,一個比另一個更受歡迎嗎?我正在編寫一個創(chuàng)建多個 s 的程序,所以是否使用orsync.WaitGroup有關系嗎?newvar
查看完整描述

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


查看完整回答
反對 回復 2023-05-15
  • 1 回答
  • 0 關注
  • 157 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號