main.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "math/rand"
  6. "sync"
  7. "time"
  8. )
  9. var wg sync.WaitGroup
  10. func SayGreetings(greeting string, times int) {
  11. for i := 0; i < times; i++ {
  12. log.Println(greeting)
  13. d := time.Second * time.Duration(rand.Intn(5)) / 2
  14. time.Sleep(d)
  15. }
  16. wg.Done() // 通知当前任务已经完成。
  17. }
  18. func main() {
  19. // {
  20. // //waitgroup 样例
  21. // rand.Seed(time.Now().UnixNano())
  22. // log.SetFlags(0)
  23. // wg.Add(2) // 注册两个新任务。
  24. // go SayGreetings("hi!", 10)
  25. // go SayGreetings("hello!", 10)
  26. // wg.Wait() // 阻塞在这里,直到所有任务都已完成。
  27. // }
  28. // {
  29. // wg.Add(1)
  30. // go func() {
  31. // time.Sleep(time.Second * 2)
  32. // wg.Done()
  33. // wg.Wait() // 阻塞在此
  34. // }()
  35. // wg.Wait() // 阻塞在此
  36. // }
  37. // {
  38. // fmt.Println(runtime.NumCPU()) //最多并行执行的协程数量
  39. // }
  40. // {
  41. // defer fmt.Println("The third line.")
  42. // defer fmt.Println("The second line.")
  43. // fmt.Println("The first line.")
  44. // // first second third
  45. // }
  46. // {
  47. // defer fmt.Println("9")
  48. // fmt.Println("0")
  49. // defer fmt.Println("8")
  50. // fmt.Println("1")
  51. // if false {
  52. // defer fmt.Println("not reachable")
  53. // }
  54. // defer func() {
  55. // defer fmt.Println("7")
  56. // fmt.Println("3")
  57. // defer func() {
  58. // fmt.Println("5")
  59. // fmt.Println("6")
  60. // }()
  61. // fmt.Println("4")
  62. // }()
  63. // fmt.Println("2")
  64. // return
  65. // defer fmt.Println("not reachable")
  66. // }
  67. {
  68. // fmt.Println(Triple(5))
  69. }
  70. {
  71. //协程和延迟调用的实参的估值时刻
  72. //延迟调用的实参,是在此延迟调用被推入延迟调用队列时被估值的。
  73. //匿名函数体内的表达式是在此函数被执行的时候才被逐渐估值的,不管是普通调用还是延迟、协程调用
  74. // {
  75. // //defer
  76. // func() {
  77. // for i := 0; i < 3; i++ {
  78. // defer fmt.Println("a:", i)
  79. // }
  80. // }()
  81. // fmt.Println()
  82. // func() {
  83. // for i := 0; i < 3; i++ {
  84. // defer func() {
  85. // fmt.Println("b:", i)
  86. // }()
  87. // }
  88. // }()
  89. // //a:2 1 0
  90. // //b:3 3 3
  91. // }
  92. // {
  93. // //同样的估值时刻规则也适用于协程调用
  94. // var a = 123
  95. // go func(x int) {
  96. // // 形参x遮挡了外层声明的变量x
  97. // fmt.Println(x)
  98. // time.Sleep(time.Second)
  99. // fmt.Println(x, a) // 123 789
  100. // fmt.Println(x, x) // 123 123 拷贝
  101. // }(a) // 将实参a传递给形参x
  102. // a = 789
  103. // time.Sleep(2 * time.Second)
  104. // }
  105. }
  106. // {
  107. // x, y := 3, 4
  108. // z := func(a, b int) (c int) {
  109. // println("a*a + b*b =", a*a+b*b) // a*a + b*b = 25
  110. // return a*a + b*b
  111. // }(x, y) // 立即调用并传递两个实参。 把x,y传递给a,b
  112. // fmt.Println(z)
  113. // }
  114. {
  115. //恐慌、恢复
  116. fmt.Println("hi")
  117. defer func() {
  118. v := recover()
  119. fmt.Println("恐慌被恢复了", v)
  120. }()
  121. panic("恐慌")
  122. }
  123. }
  124. func Triple(n int) (r int) {
  125. defer func() {
  126. fmt.Println(r)
  127. r += n // 修改返回值
  128. fmt.Println(r)
  129. }()
  130. return n + n // <=> r = n + n; return
  131. // return 10 ——> r=10 ——> 进入defer r=15 ——> return 15
  132. //这个函数先执行完return 再执行defer内部,很神奇。
  133. }