2 回答

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

TA貢獻(xiàn)1719條經(jīng)驗 獲得超6個贊
要回答您的問題,您必須傳入i您的,func以便每個例程都有自己的i.
所以你的代碼應(yīng)該是這樣的
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()
}
我編寫了這個實(shí)用程序函數(shù)來幫助并行化一組函數(shù):
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 關(guān)注
- 171 瀏覽
添加回答
舉報