Go channels: why two different outputs? -
i'm trying understand channels in go. here code example:
package main import "fmt" func main() { m := make(map[int]string) m[2] = "first value" c := make(chan bool) go func() { m[2] = "second value" c <- true }() fmt.printf("1-%s\n", m[2]) fmt.printf("2-%s\n", m[2]) _ = <-c fmt.printf("3-%s\n", m[2]) fmt.printf("4-%s\n", m[2]) }
sometimes output of above code (result 1):
1-first value 2-first value 3-second value 4-second value
but got (result 2):
1-first value 2-second value 3-second value 4-second value
after changing c := make(chan bool)
c := make(chan bool, 1)
, same occurred: result 1, result 2.
why?
your results makes perfect sense. go routine run independent of each other, never know when go routine start executing. line
m[2] = "second value"
is executed reflected on main go routine.
hence when above line executed between first , second print of program see result as
1-first value 2-second value 3-second value 4-second value
when not see other one. before third print ensure other go routine finished.
just clear more if modify program little bit like
package main import "fmt" import "time" func main() { m := make(map[int]string) m[2] = "first value" c := make(chan bool) go func() { m[2] = "second value" c <- true }() time.sleep(time.second) fmt.printf("1-%s\n", m[2]) fmt.printf("2-%s\n", m[2]) _ = <-c fmt.printf("3-%s\n", m[2]) fmt.printf("4-%s\n", m[2]) }
you following output
1-second value 2-second value 3-second value 4-second value
hope helps.
Comments
Post a Comment