思考下列例子输出什么?
func main() {
runtime.GOMAXPROCS(1)
wg := sync.WaitGroup{}
wg.Add(20)
for i := 0; i < 10; i++ {
go func() {
fmt.Println("A: ", i)
wg.Done()
}()
}
for i := 0; i < 10; i++ {
go func(i int) {
fmt.Println("B: ", i)
wg.Done()
}(i)
}
fmt.Println("C")
wg.Wait()
}
请思考…
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
hello
B: 9
A: 10
A: 10
A: 10
A: 10
A: 10
A: 10
A: 10
A: 10
A: 10
A: 10
B: 0
B: 1
B: 2
B: 3
B: 4
B: 5
B: 6
B: 7
B: 8
因为 golang 中匿名函数捕获外部变量使用的是"引用", 如下面例子:
func main() {
var a int = 10
wg := sync.WaitGroup{}
wg.Add(1)
go func() {
fmt.Printf("&a = %v\n", &a)
wg.Done()
}()
fmt.Printf("&a = %v\n", &a)
wg.Wait()
}
运行输出:
&a = 0xc000126010
&a = 0xc000126010
再思考下面例子输出什么:
func main() {
runtime.GOMAXPROCS(1)
wg := sync.WaitGroup{}
wg.Add(20)
for i := 0; i < 10; i++ {
go func() {
fmt.Println("A: ", i)
wg.Done()
}()
runtime.Gosched()
}
for i := 0; i < 10; i++ {
go func(i int) {
fmt.Println("B: ", i)
wg.Done()
}(i)
}
fmt.Println("C")
wg.Wait()
}
请思考…
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
A: 0
A: 1
A: 2
A: 3
A: 4
A: 5
A: 6
A: 7
A: 8
A: 9
hello
B: 9
B: 0
B: 1
B: 2
B: 3
B: 4
B: 5
B: 6
B: 7
B: 8
因为, runtime.Gosched()
主动让出了CPU时间片给刚刚创建的goroutine