1.panic与recover用法
package main
import (
"fmt"
)
func main() {
defer_call()
}
func defer_call() {
defer func() { fmt.Println("打印前") }()
defer func() { fmt.Println("打印中") }()
defer func() { fmt.Println("打印后") }()
defer func(){
if r := recover();r != nil{
fmt.Println(r)
}
}()
fmt.Println("debug step 1")
panic("触发异常")
//log.Panic("error happend") 会被recover处理,
//log.Fatalln("error happend") 会强行os.exit(1)
fmt.Println("continue??")
}
答:
defer 是后进先出执行顺序,类似“栈”数据结构处理逻辑;代码执行到panic时,正常的函数执行会终止,“continue”即不会被打印,开始从下到上执行defer代码块,最后执行panic.
执行结果如下:
debug step 1
触发异常
打印后
打印中
打印前
关于defer执行顺序,按照本人的理解如下:
package main
import "fmt"
type message struct {
content string
}
func (p *message) set(c string) {
p.content = c
}
func (p *message) print() string {
fmt.Println("inner defer func")
p.content += p.content
return p.content
}
func main() {
m := &message{content: "Hello"}
defer fmt.Print(m.print())
fmt.Println(m.content)
m.set("World")
fmt.Println("我是有底线的")
fmt.Println(m.content)
}
运行结果为
inner defer func
HelloHello
我是有底线的
World
HelloHello