This is a created
article in which the information may have evolved or changed.
Conclusion:
Closures can access variables in the outer code;
Foe cycle and gotoutine execution simultaneously;
All variables that operate on the goroutine are variables that manipulate the outer code directly, and the value of the variables in the outer code depends on the node that the loop executes.
Correct code:
package mainimport ("fmt""sync")func main() {var s []string = []string{ "first", "second", "third",}var waitGroup sync.WaitGroupwaitGroup.Add(len(s))for _, item := range s { go func(i string) { fmt.Println(item) waitGroup.Done() }(item)}waitGroup.Wait()}
Output:
firstsecondthird
Error instance:
for _, item := range s { go func() { fmt.Println(item) waitGroup.Done() }()}
Output:
thirdthirdthird
The following examples can explain what happens above:
for _, item := range s { go func() { fmt.Println(item) waitGroup.Done() }() time.Sleep(1 * time.Second)}
Output:
thirdthirdthird