Closured variables and the go statement
In this section, we are going to talk about closured variables, which are variables inside closures, and the go
statement. Notice that closured variables in goroutines are evaluated when the goroutine actually runs and when the go
statement is executed in order to create a new goroutine. This means that closured variables are going to be replaced by their values when the Go scheduler decides to execute the relevant code. This is illustrated in the main()
function of goClosure.go
:
func main() {
for i := 0; i <= 20; i++ {
go func() {
fmt.Print(i, " ")
}()
}
time.Sleep(time.Second)
fmt.Println()
}
Running goClosure.go
produces the next output:
$ go run goClosure.go
3 7 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21
The program mostly prints the number 21
, which is the last value of the variable of the for
loop and not the other numbers. As i
is a closured variable...