main.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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. func Triple(n int) (r int) {
  72. defer func() {
  73. fmt.Println(r)
  74. r += n // 修改返回值
  75. fmt.Println(r)
  76. }()
  77. return n + n // <=> r = n + n; return
  78. // return 10 ——> r=10 ——> 进入defer r=15 ——> return 15
  79. //这个函数先执行完return 再执行defer内部,很神奇。
  80. }