美文网首页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】底层易错点总结

    闭包特殊性 闭包对捕获的外部变量并不是传值方式访问,而是以引用的方式访问。如以下defer 因为defer后面是一...

  • golang易错点

    sdfsdsdfs

  • 【golang】slice底层函数传参原理易错点

    切片底层结构 切片的底层结构主要包括引用数组的地址data,切片长度len与切片容量cap。 以切片为参数调用函数...

  • 【golang】易错知识点

    channel关闭问题 close管道后,继续忘channel发送数据会出错,但可以接受数据,将读取到零值,可以多次读取

  • JavaScript易错点总结

    1、Boolean和Number运算 2、数组差值时的map陷阱 想象一下你有这样的代码: a)这会导致崩溃吗? ...

  • <Golang Tips> 易错点

    defer 遵循LIFO(后进先出)原则https://play.golang.org/p/kIqLpGJRjgi...

  • 【golang】select{}中break的易错点

    一个select语句用来选择哪个case中的发送或接收操作可以被立即执行。它类似于switch语句,但是它的cas...

  • C语言易错点总结

    #include < > 和#include " "的区别: #include < >编译器在预设目录中搜索头文件...

  • 易错点

    rate_ave=1042.00/793 而非rate_ave=1042/793if rate>=rate_av...

  • 易错点

    泛型 泛型约束使用extends而非implements 泛型类型没有多态的说法,所以出现了?通配符 泛型方法必须...

网友评论

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

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