For what it's worth, there is a popular proposal up that suggests changing for range loops to redefine their variables for every iteration: https://golang.org/issues/20733
On Mon, Feb 11, 2019 at 4:58 PM Burak Serdar <bser...@ieee.org> wrote: > On Mon, Feb 11, 2019 at 5:48 PM Slawomir Pryczek <slawek1...@gmail.com> > wrote: > > > > Hi Guys, > > > > When looking at this code below, you can see that the function will get > LAST value of i which is incremented inside the loop, but t is somehow > copied and taken inside a function so closure is created and it is bound to > current value of t, so we'll have its current value in function. This is > strange as t and i is defined on the same code block level (t will be > discarded at the same time as i, after the loop). > > > > I always thought that t would need to be passed explicitly to goroutine > to retain current value (which i did). But why assigning value in a loop is > treated differently in this regard than a straight assignment? Any URL > where such "special cases" are documented? Isn't it kind of design flaw, > because this seem very confusing that loop is creating single value and > simple assignment is creating multiple copies? Maybe you consider changing > this in go2? > > > This is well-documented behavior. The first link I can find is: > https://github.com/golang/go/wiki/CommonMistakes > > The common mistake is to think that the for-loop variable is captured > as value in the closure. It is not, it is a reference, and the > go-routine sees the value of the variable when it runs, not when it is > created. > > > > > https://play.golang.org/p/6vx_qDOk51g > > > > 10 1 > > 10 0 > > 10 9 > > 10 8 > > 10 7 > > 10 6 > > 10 5 > > 10 4 > > 10 3 > > 10 2 > > > > > > Thanks, > > Slawomir. > > > > > > ----- > > package main > > import ( > > "fmt" > > "time" > > ) > > > > func main() { > > for i := 0; i < 10; i++ { > > t := i > > go func() { > > time.Sleep(time.Millisecond * 100) > > fmt.Println(i, t) > > }() > > } > > time.Sleep(time.Millisecond * 1000) > > } > > > > > > > > -- > > You received this message because you are subscribed to the Google > Groups "golang-nuts" group. > > To unsubscribe from this group and stop receiving emails from it, send > an email to golang-nuts+unsubscr...@googlegroups.com. > > For more options, visit https://groups.google.com/d/optout. > > -- > You received this message because you are subscribed to the Google Groups > "golang-nuts" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to golang-nuts+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.