closures_goroutines.go 846 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. // closures_goroutines.go
  2. package main
  3. import (
  4. "fmt"
  5. "time"
  6. )
  7. var values = [5]int{10, 11, 12, 13, 14}
  8. func main() {
  9. // version A:
  10. for ix := range values { // ix is index!
  11. func() {
  12. fmt.Print(ix, " ")
  13. }() // call closure, prints each index
  14. }
  15. fmt.Println()
  16. // version B: same as A, but call closure as a goroutine
  17. for ix := range values {
  18. go func() {
  19. fmt.Print(ix, " ")
  20. }()
  21. }
  22. time.Sleep(1e9)
  23. // version C: the right way
  24. for ix := range values {
  25. go func(ix interface{}) {
  26. fmt.Print(ix, " ")
  27. }(ix)
  28. }
  29. time.Sleep(1e9)
  30. // version D: print out the values:
  31. for ix := range values {
  32. val := values[ix]
  33. go func() {
  34. fmt.Print(val, " ")
  35. }()
  36. }
  37. time.Sleep(1e9)
  38. }
  39. /* Output:
  40. 0 1 2 3 4
  41. 4 4 4 4 4
  42. 1 0 3 4 2
  43. 0 1 2 4 3
  44. */