效果:
- 普通for循環(huán)
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
const N = 3
wg.Add(N)
for i := 0; i < N; i++ {
go func() {
fmt.Println(i)
wg.Done()
}()
}
wg.Wait()
}
可能得輸出:
2
0
1
對比:使用1.18版本的go運行滨攻,輸出如下:
3
3
3
- for...rang循環(huán):
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
const N = 3
wg.Add(N)
for i := range []int{1, 2, 3} {
go func() {
fmt.Println(i)
wg.Done()
}()
}
wg.Wait()
}
可能得輸出:
2
1
0
對比:使用1.18版本的go運行,輸出如下:
2
2
2
至于為啥普通for循環(huán)輸出3饶唤,而for...range循環(huán)輸出2徐伐。這是因為普通for循環(huán)在最后一次循環(huán)后還會進行一次i++
操作,i的值就變成3了募狂,當判斷循環(huán)條件時不滿足退出循環(huán)办素,但goroutine引用的i也就是3了。
官方文檔:
Release Notes
文檔鏈接:https://go.dev/doc/go1.21