1 回答

TA貢獻1817條經驗 獲得超6個贊
你my_func()不應該知道/不應該關心它是如何執行的(無論是否在新的 goroutine 中)。所以就為了這個你不應該通過wg。不要強制并發或非并發使用你的 API,讓你的包的用戶決定他們希望如何調用它。
如果有人希望同時運行它,在一個新的 goroutine 中,wg可以這樣處理my_func():
wg.Add(1)
go func() {
defer wg.Done()
my_func()
}()
這也提供了在將在調用之前執行的函數調用之前/之后放置更多代碼的可能性wg.Done():
wg.Add(1)
go func() {
defer wg.Done()
// other code before
my_func()
// other code after
}()
還要注意,如果你在很多地方都有這個,你可以創建一個輔助函數來處理 goroutine 啟動和等待組處理:
func launchMyFunc(wg *sync.WaitGroup) {
go func() {
defer wg.Done()
my_func()
}()
}
您還可以創建一個接受任意無參數不返回函數的助手:
func launchFunc(wg *sync.WaitGroup, f func()) {
go func() {
defer wg.Done()
f()
}()
}
使用上面的助手,你可以這樣做:
wg.Add(1)
launchMyFunc(wg)
// or
wg.Add(1)
launchFunc(wg, my_func)
- 1 回答
- 0 關注
- 107 瀏覽
添加回答
舉報