2 回答

TA貢獻1789條經驗 獲得超8個贊
在這種情況下,在 for 循環完成之前,不會調度任何 goroutine。為了使 for 循環中斷,i
必須不小于或等于 5,因此在該點為 6。當 goroutine 運行時,它們每個都會打印i
在閉包中捕獲的單個變量的值。
當您將i
參數作為參數傳遞給函數時,您將當前值復制到一個新變量中,并捕獲當時的值。

TA貢獻1719條經驗 獲得超6個贊
要回答您的問題,您必須傳入i您的,func以便每個例程都有自己的i.
所以你的代碼應該是這樣的
func main() {
var wg sync.WaitGroup
for i := 1; i <= 5; i++ {
wg.Add(1)
go func(i int) {
fmt.Println(i)
time.Sleep(time.Second * 1)
wg.Done()
}(i)
}
wg.Wait()
}
我編寫了這個實用程序函數來幫助并行化一組函數:
import "sync"
// Parallelize parallelizes the function calls
func Parallelize(functions ...func()) {
var waitGroup sync.WaitGroup
waitGroup.Add(len(functions))
defer waitGroup.Wait()
for _, function := range functions {
go func(copy func()) {
defer waitGroup.Done()
copy()
}(function)
}
}
所以在你的情況下,我們可以這樣做
func main() {
functions := []func(){}
for i := 1; i <= 5; i++ {
function := func(i int) func() {
return func() {
fmt.Println(i)
}
}(i)
functions = append(functions, function)
}
Parallelize(functions...)
fmt.Println("Done")
}
如果你想使用 Parallelize 功能,你可以在這里找到它https://github.com/shomali11/util
- 2 回答
- 0 關注
- 173 瀏覽
添加回答
舉報