go defer 用法

import (  
    "fmt"
    "time"
)

func main() {  
    i, p := a()
    fmt.Println("return :", i, p, time.Now())
}

func a() (i int, p *int) {  
    defer func(i int) {
        fmt.Println("defer3 :", i, &i, time.Now())
    }(i)
    defer fmt.Println("defer2 :", i, &i, time.Now())
    defer func() {
        fmt.Println("defer1 :", i, &i, time.Now())
    }()
    i++
    func() {
        fmt.Println("print1 :", i, &i, time.Now())
    }()
    fmt.Println("print2 :", i, &i, time.Now())
    return i, &i
}
print1 : 1 0xc0000180a8 2019-03-07 17:31:58.225702 +0800 CST m=+0.000335484  
print2 : 1 0xc0000180a8 2019-03-07 17:31:58.225884 +0800 CST m=+0.000518258  
defer1 : 1 0xc0000180a8 2019-03-07 17:31:58.22589 +0800 CST m=+0.000524327  
defer2 : 0 0xc0000180a8 2019-03-07 17:31:58.225699 +0800 CST m=+0.000332952  
defer3 : 0 0xc000018188 2019-03-07 17:31:58.225897 +0800 CST m=+0.000531126  
return : 1 0xc0000180a8 2019-03-07 17:31:58.225901 +0800 CST m=+0.000534352
开始执行函数
遇到defer 压入栈

defer3 (我等会要执行匿名函数,参数是i,还不知道是多少)  
|
defer2 (我要等会要打印i,我知道了i的默认值是0)  
|
defer1 (我等会要执行匿名函数,i要继承 现在不知道是多少)  
|
i++ (默认是0,现在我变成1了)  
|
匿名函数执行 (i 的 值是1) 
结果:打印 print1 的值 1
|
打印函数 (i 的 值是1) 
结果:打印print2 的值1
|
要return了,去找defer扫尾,先入后出
|
defer1 (我的i来自继承 所以 i = 1)  
结果: 打印 defer1 的值1
|
defer2 (我的i在函数执行到我这的时候就知道i=0)  
结果: 打印 defer2 的值 0
|
defer3 (我的i是局部变量,所以 i=0)  
结果: 打印 defer3 的值 0
|
所有defer执行完了,该return了,执行main中的打印函数
结果: 打印 return 的值 1