fork download
  1. package main
  2.  
  3. import "time"
  4. import "log"
  5. import "fmt"
  6.  
  7. var delayA uint = 3
  8. var delayB uint = 3
  9.  
  10. func longCalc(x int, delay uint) int {
  11. log.Println("calc", x)
  12. time.Sleep(time.Duration(delay) * time.Second)
  13. log.Println("done", x)
  14. return x
  15. }
  16.  
  17. func longCalcAsync(x int, delay uint) (chan int) {
  18. result := make(chan int)
  19. go func() {
  20. result <- longCalc(x, delay)
  21. }()
  22. return result
  23. }
  24.  
  25. func bar() {
  26. log.Println("bar")
  27. }
  28.  
  29. // --------------------------------
  30.  
  31.  
  32.  
  33. func foo1() {
  34. a := <- longCalcAsync(1, delayA)
  35. b := <- longCalcAsync(2, delayB)
  36. log.Println("foo", a, b)
  37. }
  38.  
  39. func foo2() {
  40. ca := longCalcAsync(1, delayA)
  41. cb := longCalcAsync(2, delayB)
  42. a := <- ca
  43. b := <- cb
  44. log.Println("foo", a, b)
  45. }
  46.  
  47. func foo3a() {
  48. a := longCalc(1, delayA)
  49. b := longCalc(2, delayB)
  50. log.Println("foo", a, b)
  51. }
  52.  
  53. func foo3b() (chan bool) {
  54. done := make(chan bool)
  55. go func() {
  56. foo3a()
  57. done <- true
  58. }()
  59. return done
  60. }
  61.  
  62. // --------------------------------
  63.  
  64.  
  65.  
  66. func test1() {
  67. go foo1()
  68. bar()
  69. time.Sleep(10 * time.Second)
  70. }
  71.  
  72. func test2() {
  73. go foo2()
  74. bar()
  75. time.Sleep(10 * time.Second)
  76. }
  77.  
  78. func test3a() {
  79. go foo3a()
  80. bar()
  81. time.Sleep(10 * time.Second)
  82. }
  83.  
  84. func test3b() {
  85. done := foo3b()
  86. bar()
  87. <- done
  88. }
  89.  
  90. // --------------------------------
  91.  
  92.  
  93.  
  94. func init() {
  95. log.SetFlags(log.Ltime)
  96. }
  97.  
  98. func main() {
  99. test1()
  100. fmt.Println("--------")
  101. test2()
  102. fmt.Println("--------")
  103. test3a()
  104. fmt.Println("--------")
  105. test3b()
  106. }
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty