// closures_goroutines.go package main import ( "fmt" "time" ) var values = [5]int{10, 11, 12, 13, 14} func main() { // version A: for ix := range values { // ix is index! func() { fmt.Print(ix, " ") }() // call closure, prints each index } fmt.Println() // version B: same as A, but call closure as a goroutine for ix := range values { go func() { fmt.Print(ix, " ") }() } time.Sleep(1e9) // version C: the right way for ix := range values { go func(ix interface{}) { fmt.Print(ix, " ") }(ix) } time.Sleep(1e9) // version D: print out the values: for ix := range values { val := values[ix] go func() { fmt.Print(val, " ") }() } time.Sleep(1e9) } /* Output: 0 1 2 3 4 4 4 4 4 4 1 0 3 4 2 0 1 2 4 3 */