|
@@ -69,7 +69,61 @@ func main() {
|
|
|
// defer fmt.Println("not reachable")
|
|
|
// }
|
|
|
{
|
|
|
- fmt.Println(Triple(5))
|
|
|
+ // fmt.Println(Triple(5))
|
|
|
+ }
|
|
|
+ {
|
|
|
+ //协程和延迟调用的实参的估值时刻
|
|
|
+ //延迟调用的实参,是在此延迟调用被推入延迟调用队列时被估值的。
|
|
|
+ //匿名函数体内的表达式是在此函数被执行的时候才被逐渐估值的,不管是普通调用还是延迟、协程调用
|
|
|
+ // {
|
|
|
+ // //defer
|
|
|
+ // func() {
|
|
|
+ // for i := 0; i < 3; i++ {
|
|
|
+ // defer fmt.Println("a:", i)
|
|
|
+ // }
|
|
|
+ // }()
|
|
|
+ // fmt.Println()
|
|
|
+ // func() {
|
|
|
+ // for i := 0; i < 3; i++ {
|
|
|
+ // defer func() {
|
|
|
+ // fmt.Println("b:", i)
|
|
|
+ // }()
|
|
|
+ // }
|
|
|
+ // }()
|
|
|
+ // //a:2 1 0
|
|
|
+ // //b:3 3 3
|
|
|
+ // }
|
|
|
+ // {
|
|
|
+ // //同样的估值时刻规则也适用于协程调用
|
|
|
+ // var a = 123
|
|
|
+ // go func(x int) {
|
|
|
+ // // 形参x遮挡了外层声明的变量x
|
|
|
+ // fmt.Println(x)
|
|
|
+ // time.Sleep(time.Second)
|
|
|
+ // fmt.Println(x, a) // 123 789
|
|
|
+ // fmt.Println(x, x) // 123 123 拷贝
|
|
|
+ // }(a) // 将实参a传递给形参x
|
|
|
+ // a = 789
|
|
|
+ // time.Sleep(2 * time.Second)
|
|
|
+ // }
|
|
|
+ }
|
|
|
+ // {
|
|
|
+ // x, y := 3, 4
|
|
|
+ // z := func(a, b int) (c int) {
|
|
|
+ // println("a*a + b*b =", a*a+b*b) // a*a + b*b = 25
|
|
|
+ // return a*a + b*b
|
|
|
+ // }(x, y) // 立即调用并传递两个实参。 把x,y传递给a,b
|
|
|
+ // fmt.Println(z)
|
|
|
+ // }
|
|
|
+ {
|
|
|
+ //恐慌、恢复
|
|
|
+ fmt.Println("hi")
|
|
|
+ defer func() {
|
|
|
+ v := recover()
|
|
|
+ fmt.Println("恐慌被恢复了", v)
|
|
|
+ }()
|
|
|
+ panic("恐慌")
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
|