一个go闭包使用上的小坑
一个go闭包使用上的小坑
无意间看到这样一串代码:
m := make(map[int]int, 10)
for i := 1; i<= 10; i++ {
    m[i] = i
}
for k, v := range(m) {
    go func() {
        fmt.Println("k ->", k, "v ->", v)
    }()
好奇 跑了一下:
go run tmp.go 
k -> 7 v -> 7
k -> 7 v -> 7
k -> 7 v -> 7
k -> 4 v -> 4
k -> 7 v -> 7
k -> 7 v -> 7
k -> 7 v -> 7
k -> 7 v -> 7
k -> 7 v -> 7
k -> 7 v -> 7
可以看到 go闭包里头并发的使用外部自由变量后,输出的结果出乎意料是错乱的,
这说明这种情形,应该是用传参的方式,而非引用外部变量
修改方法两种:
1.传参
m := make(map[int]int, 10)
for i := 1; i<= 10; i++ {
    m[i] = i
}
for k, v := range(m) {
    go func(k, v int) {
        fmt.Println("k ->", k, "v ->", v)
    }(k, v)
}
2.串行执行
m := make(map[int]int, 10)
for i := 1; i<= 10; i++ {
    m[i] = i
}
for k, v := range(m) {
    func() {
        fmt.Println("k ->", k, "v ->", v)
    }()
}
go run tmp.go 
k -> 1 v -> 1
k -> 6 v -> 6
k -> 10 v -> 10
k -> 2 v -> 2
k -> 3 v -> 3
k -> 4 v -> 4
k -> 5 v -> 5
k -> 7 v -> 7
k -> 8 v -> 8
k -> 9 v -> 9
     作者 —— 靑い空゛
        
出处:http://www.cnblogs.com/ailumiyana/
除特别注明外,本站所有文章均为靑い空゛原创,欢迎转载分享,但请注明出处。
出处:http://www.cnblogs.com/ailumiyana/
除特别注明外,本站所有文章均为靑い空゛原创,欢迎转载分享,但请注明出处。
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号