闭包特殊性
闭包对捕获的外部变量并不是传值方式访问,而是以引用的方式访问。
如以下defer
func main(){
for i := 0; i < 3; i++ {
defer func() { println(i) }()
}
}
因为defer后面是一个闭包,其是对i的引用,所以最后打印为:
dzd@dzd:/opt/gocode/src/github.com/gpa$ go run .
3
3
3
如果想要进行值传递,只需把i以参数形式传入
func main(){
for i := 0; i < 3; i++ {
defer func() { println(i) }(i)
}
}
因为defer输出为先进后出,所以0最后打印
输出
2
1
0
异常捕获recover()必须直接调用
捕获在 defer 函数中必须直接调用 recover ,如果 defer 中调用的是 recover 函数的包装函数的话,异常的捕获工作将失败,比如以下对recover()进行包装
func main() {
defer func() {
/ / 无法捕获异常
if r := MyRecover(); r != nil {
fmt.Println(r)
}
}()
panic(1)
}
func MyRecover() interface{} {
log.Println("trace...")
return recover()
}
网友评论