golang 编程笔记

【golang】底层易错点总结

2020-04-22  本文已影响0人  dongzd

闭包特殊性

闭包对捕获的外部变量并不是传值方式访问,而是以引用的方式访问。
如以下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()
}
上一篇 下一篇

猜你喜欢

热点阅读