本文共 1720 字,大约阅读时间需要 5 分钟。
func doSomething(fileName string) { file,err := os.Open(fileName) if err != nil { panic(err) } defer file.Close()}
try{}finally{}
defer声明的函数读写外部变量,和闭包差不多。比如下面的代码
func doSomething() { v := 10 defer func() { fmt.Println(v) v++ fmt.Println(v) }() v += 5}
输出为
1516
就像闭包一样,如果不是defer函数方法内的变量会向上一层函数访问变量,重新做计算。
1 func doSomething() (rev int) {2 defer func() {3 rev++4 }()5 6 return 57 }
第6行的return 相当于
return rev = 5
defer 声明的匿名函数会在return 之前执行,相当于
rev = 5// 执行defer方法rev++//然后returnreturn
所以结果是6
我把代码做一点点修改
1 func doSomething() (rev int) {2 v := 103 defer func() {4 v++5 }()6 7 return v8 }
第7行返回的是局部变量v.
return v 相当于 return rev = v
defer 函数里是对局部变量v的操作,所以与返回的rev没有关系。所有执行的结果是:10
func doSomething() { defer fmt.Println(1) defer fmt.Println(2)}
func doSomething() { defer func() { if err := recover(); err != nil { fmt.Print(err) } }() fmt.Println("Running...") panic("run error")}
输出:
Running...run error
recover 会捕获panic的异常。我再把代码做一点点修改:
func doSomething() { defer func() { if err := recover(); err != nil { fmt.Print(err) } }() defer func() { panic("defer error") }() fmt.Println("Running...") panic("run error")}
输出结果
Running...defer error
因为 recover()只捕获最后一次panic
转载地址:http://uweal.baihongyu.com/