這是我的意思的一個簡單例子package mainimport ( "sync" "testing" "time")func TestWaitGroup(t *testing.T) { var wg sync.WaitGroup quitSig := make(chan struct{}) go func(wg sync.WaitGroup, quitChan, chan struct{}) { defer func() { t.Log("Done...") wg.Done() t.Log("Done!") }() t.Log("waiting for quit channel signal...") <-quitChan t.Log("signal received") }(wg, quitSig) time.Sleep(5*time.Second) t.Log("Done sleeping") close(quitSig) t.Log("closed quit signal channel") wg.Wait() t.Log("goroutine shutdown")}當我運行它時,我得到以下信息=== RUN TestWaitGroup main.go:18: waiting for quit channel signal... main.go:23: Done sleeping main.go:25: closed quit signal channel main.go:20: signal received main.go:14: Done... main.go:16: Done! 它只是掛起直到超時。如果你只是做defer wg.Done()同樣的行為觀察。我在跑go1.18。這是一個錯誤還是我在這種情況下沒有正確使用 WaitGroups?
2 回答

翻閱古今
TA貢獻1780條經驗 獲得超5個贊
您正在傳遞等待組的副本,因此 goroutine 不會影響在外部范圍內聲明的等待組。通過以下方式修復它:
go func(wg *sync.WaitGroup, quitChan, chan struct{}) {
...
}(&wg, quitSig)
- 2 回答
- 0 關注
- 161 瀏覽
添加回答
舉報
0/150
提交
取消