golang独学の道(defer圧桟)10

1147 ワード

defer fmt.Println("a")
defer fmt.Println("b")
defer fmt.Println("c")

出力:
c b a
先に進んで後に出,後に進んで先に出る.
まとめ:異常があるかどうかにかかわらず、deferは関数のスタックから出る前のステップで実行され、関数がスタックから出ない限り、defer修飾はすべて実行されます.
順序:関数内の他の文-defer文-関数スタック
// 1:
func f() (result int) {
    defer func() {
        result++
    }()
    return 0
}
 
// 2:
func f() (r int) {
    t := 5
    defer func() {
        t = t + 5
    }()
    return t
}
 
// 3:
func f() (r int) {
    defer func(r int) {
        r = r + 5
    }(r)
    return 1
}

 
func f() (result int) {
    result = 0 //return          ,return xxx     +ret  
    func() { //defer    return    ,        ret    
        result++
    }()
    return
}
//        1。
 
//   2,        :
func f() (r int) {
    t := 5
    r = t //    
    func() { //defer             ,        r     
        t = t + 5
    }
    return //  return  
}
//        5。
 
//    3,      :
func f() (r int) {
    r = 1 //      
    func(r int) { //    r       r,          r 
        r = r + 5
    }(r)
    return //  return
}
//          1