12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- package main
- import (
- "fmt"
- "log"
- "math/rand"
- "sync"
- "time"
- )
- var wg sync.WaitGroup
- func SayGreetings(greeting string, times int) {
- for i := 0; i < times; i++ {
- log.Println(greeting)
- d := time.Second * time.Duration(rand.Intn(5)) / 2
- time.Sleep(d)
- }
- wg.Done() // 通知当前任务已经完成。
- }
- func main() {
- // {
- // //waitgroup 样例
- // rand.Seed(time.Now().UnixNano())
- // log.SetFlags(0)
- // wg.Add(2) // 注册两个新任务。
- // go SayGreetings("hi!", 10)
- // go SayGreetings("hello!", 10)
- // wg.Wait() // 阻塞在这里,直到所有任务都已完成。
- // }
- // {
- // wg.Add(1)
- // go func() {
- // time.Sleep(time.Second * 2)
- // wg.Done()
- // wg.Wait() // 阻塞在此
- // }()
- // wg.Wait() // 阻塞在此
- // }
- // {
- // fmt.Println(runtime.NumCPU()) //最多并行执行的协程数量
- // }
- // {
- // defer fmt.Println("The third line.")
- // defer fmt.Println("The second line.")
- // fmt.Println("The first line.")
- // // first second third
- // }
- // {
- // defer fmt.Println("9")
- // fmt.Println("0")
- // defer fmt.Println("8")
- // fmt.Println("1")
- // if false {
- // defer fmt.Println("not reachable")
- // }
- // defer func() {
- // defer fmt.Println("7")
- // fmt.Println("3")
- // defer func() {
- // fmt.Println("5")
- // fmt.Println("6")
- // }()
- // fmt.Println("4")
- // }()
- // fmt.Println("2")
- // return
- // defer fmt.Println("not reachable")
- // }
- {
- fmt.Println(Triple(5))
- }
- }
- func Triple(n int) (r int) {
- defer func() {
- fmt.Println(r)
- r += n // 修改返回值
- fmt.Println(r)
- }()
- return n + n // <=> r = n + n; return
- // return 10 ——> r=10 ——> 进入defer r=15 ——> return 15
- //这个函数先执行完return 再执行defer内部,很神奇。
- }
|