Thanks to all who answered; I got explanation I needed. @"Michael Jones": yes, your solution also works - "i := i" overshadows the i defined as part of the for-loop and that was also explained in one of the Go-blogs.
Anyways, as I have already acknowledged earlier, this was an RTFM moment for me. Had I read the relevant blogs / articles earlier, I wouldn't have asked this at all. rgds, Vatsan Google+ <https://google.com/+SrivathsanMadhavan> Maverick Software Engineer <https://plus.google.com/b/102005838874122947401/102005838874122947401/posts> On Sun, Feb 12, 2017 at 8:20 PM, Michael Jones <michael.jo...@gmail.com> wrote: > These answers are all correct. > > Here is another way to see the problem and address it. Not as clear to the > next reader perhaps so not the recommendation, but a good example to > contemplate. "Precisely what does this extra statement do?" > > package main > > import "fmt" > import "log" > > func main() { > for i := 0; i < 5; i++ { > i := i > go func() { > log.Println("i=", i) > }() > } > > fmt.Print("Press <Enter> to quit...") > var input string > fmt.Scanln(&input) > } > > > > On Sun, Feb 12, 2017 at 3:12 AM, Ayan George <a...@ayan.net> wrote: > >> Srivathsan Madhavan <m.srivath...@gmail.com> wrote: >> >> > Hi all, >> > >> > I still consider myself a newbie to Golang hence my question here could >> be >> > due to my fundamental misunderstanding of this language >> > >> > I have the following code: >> > >> > func main() { >> > >> > for i := 0; i < 5; i++ { >> > >> > go func() { >> > >> > log.Println("i=", i) >> > >> > }() >> > >> > } >> > >> > >> > fmt.Print("Press <Enter> to quit...") >> > >> > var input string >> > >> > fmt.Scanln(&input) >> > >> > } >> > >> > >> > The output I expect is 0, 1, 2, 3, and 4 in any jumbled order. But >> what I >> > got was 5, 5, 5, 5 and 5! Why is that so? >> > >> >> I'm learning golang too so please correct any errors here. >> >> It looks like you created a closure where i is lexically scoped to >> each of your gofunc() instances. Since they're all accessing the same >> i variable, you're seeing the race between incrementing i and spooling >> up / starting each goroutine -- that is, the value of i reaches 5 >> before all of the goroutines get to print it. You can verify this by >> printing the address of i by changing your log.Println() call to >> something like: >> >> log.Printf("i = %d, &i = %p", i, &i) >> >> The addresses should be the same. >> >> If you want each goroutine to have a copy of I, you should declare and >> run gofunc() like below: >> >> gofunc(c int) { >> log.Println("c=",c) >> }(i) >> >> Which passes a copy of i to each routine. That should give you what >> you're looking for -- that is if you're not expecting i to be printed >> in order. :) >> >> -ayan >> >> -- >> 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. >> > > > > -- > Michael T. Jones > michael.jo...@gmail.com > -- 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.