GO defer探究

1、当函数内的所有正常语句都执行完毕时, 只有其中所有的defer都执行完毕,此函数才真正的执行结束
2、 当执行函数中的return 时, 只有所有的defer函数都执行完成, 才会真正的返回结果
3、 当函数中引起panic时,只有所有的defer函数都执行完成, 此panic才会真正的扩展到函数的调用处

有多个Defer时,执行顺序是: 先进后出, 后进先出 === 最后一个先执行,第一个最后执行
package main

import "fmt"

func main() {
   defer func() {
      fmt.Println(111)
   }()

   defer func() {
      fmt.Println(222)
   }()

   defer func() {
      fmt.Println(333)
   }()
}
//输出 
333
222
111

 

defer与return执行顺序, defer在return之前执行
func func3() int {
   fmt.Println("进入func3")
   defer func() {
      fmt.Println("func3 defer")
   }()
   return 123
}
func main(){
    fmt.Println(func3()) 
}
//输出
1 --- 进入func3
2 --- func3 defer
3 --- 123

 

defer与panic
func func3() int {
   fmt.Println("进入func3")
   defer func() {
      fmt.Println("func3 defer")
   }()
   panic(111)
   return 123
}
//输出 
进入func3
func3 defer
panic: 111

goroutine 1 [running]:
main.func3(0x0)
	D:/site/go/test/多个defer执行顺序.go:14 +0xc7
main.main()
	D:/site/go/test/多个defer执行顺序.go:30 +0x29

 

0

发表评论

邮箱地址不会被公开。