golang的for和闭包与goroutine使用中的坑

go func 并不能保证立即执行,在它还没有执行的时候,item值已经被for循环改变了。

 

正确代码:

package main

import (
"fmt"
"sync"
)

func main() {
var s []string = []string{
    "1",
    "2",
    "3",
}

var waitGroup sync.WaitGroup
waitGroup.Add(len(s))

for _, item := range s {
    go func(i string) {
        fmt.Println(item)
        waitGroup.Done()
    }(item)
}

waitGroup.Wait()
}

输出:

1
2
3

错误实例:

for _, item := range s {
    go func() {
        fmt.Println(item)
        waitGroup.Done()
    }()
}

输出:

3
3
3

你可能感兴趣的:(go)