美文网首页golang 编程笔记
【golang】底层易错点总结

【golang】底层易错点总结

作者: dongzd | 来源:发表于2020-04-22 16:56 被阅读0次

    闭包特殊性

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

    相关文章

      网友评论

        本文标题:【golang】底层易错点总结

        本文链接:https://www.haomeiwen.com/subject/nfkwihtx.html