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内部,很神奇。 }