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