1.下面代码输出的内容
package main
import "fmt"
func main() {
defer_call()
}
func defer_call() {
defer func() { fmt.Println("打印前") }()
defer func() { fmt.Println("打印中") }()
defer func() { fmt.Println("打印后") }()
panic("触发异常")
}
知识点:defer语句的执行顺序是后进先出,也就是从下往上执行,当出现panic时,会先按照defer的先进后出的顺序执行,最后才会执行panic
输出:
$ go run main.go
打印后
打印中
打印前
panic: 触发异常
goroutine 1 [running]:
main.defer_call()
C:/GOPATH/src/Test/main.go:13 +0x98
main.main()
C:/GOPATH/src/Test/main.go:6 +0x27
exit status 2
附加知识点:panic发生的语句之前的defer按照后进先出的顺序执行,也就是说,defer语句如果写在发生panic之后,则不会执行,下面举个例子:
package main
import "fmt"
func main() {
defer_call()
}
func defer_call() {
defer func() { fmt.Println("打印前") }()
defer func() { fmt.Println("打印中") }()
panic("触发异常")
defer func() { fmt.Println("打印后") }()
}
输出:
$ go run main.go
打印中
打印前
panic: 触发异常
goroutine 1 [running]:
main.defer_call()
C:/GOPATH/src/Test/main.go:12 +0x7c
main.main()
C:/GOPATH/src/Test/main.go:6 +0x27
exit status 2