#############################
package main import ( "fmt" "time" ) // 规则一 当defer被声明时,其参数就会被实时解析 // 规则二 多个defer执行顺序:defer执行顺序为先进后出 // 规则三 defer可以读取有名返回值 // 规则四 执行时机:函数return之后,函数返回给调用方之前之前 func DeferTimeX() { startAt := time.Now() defer fmt.Println(time.S***artAt)) time.Sleep(10 * time.Second) } func DeferTimeY() { startAt := time.Now() defer func() { fmt.Println(time.S***artAt)) }() time.Sleep(3 * time.Second) } func DeferOrder() { defer fmt.Println("defer runs") fmt.Println("block ends") for i := 0; i < 10; i++ { defer fmt.Println(i) } fmt.Println("main ends") } func DeferPara() { i := 2 defer fmt.Println("************* ", i) //输出2,因为i此时就是2 i = i * 2 defer fmt.Println("$$$$$$$$$$$$$ ", i) //输出4,因为i此时就是4 i = i * 2 fmt.Println("=================== ", i) //输出8 } // 没有修改返回值 func DeferFuncX() int { var i int fmt.Println("DeferFuncX ..........") fmt.Println("init at :", i) defer func() { fmt.Println("starting at :", i) //i此时就是16 i++ fmt.Println("end at :", i) //输出17 }() return 16 } // 修改了返回值 func DeferFuncY() (i int) { fmt.Println("DeferFuncY ..........") fmt.Println("init at :", i) defer func() { fmt.Println("starting at :", i) //i此时就是16 i++ fmt.Println("end at :", i) //输出17 }() return 16 } func main() { DeferTimeX() DeferTimeY() DeferOrder() DeferPara() fmt.Println(DeferFuncX()) fmt.Println(DeferFuncY()) }
##########################