美文网首页
golang :切忌在循环中直接使用defer

golang :切忌在循环中直接使用defer

作者: 郭青耀 | 来源:发表于2020-07-28 14:07 被阅读0次

看下面的例子:

for {
    time.Sleep(time.Second)
    // ......
    conn, err := grpc.Dial(address, grpc.WithInsecure())
    if err != nil {
        log.Fatalf("did not connect: %v", err)
    }
    defer conn.Close()
        //...
}

由于这是一个死循环,defer代码不会被执行到,所以申请的内存得不到释放,然后会导致程序占满整个内存,死机。 注意这里需要强调的是直接使用,如果是封装到匿名函数中,结果就不一样了

for {
    time.Sleep(time.Second)
    // ......
    go func (){
        conn, err := grpc.Dial(address, grpc.WithInsecure())
        if err != nil {
            log.Fatalf("did not connect: %v", err)
        }
        defer conn.Close()
    }
        //...
}

这里的defer会在匿名函数结束的时候得到执行,所以这样写就不会出现之前的资源没有释放的情况。

相关文章

  • golang :切忌在循环中直接使用defer

    看下面的例子: 由于这是一个死循环,defer代码不会被执行到,所以申请的内存得不到释放,然后会导致程序占满整个内...

  • 2017-12-04

    Golang,Panic,Defer,Recover 在golang中,recover在defer里发挥作用。 一...

  • go defer理解

    golang的defer是怎么工作的?defer在golang里是一个很基础的关键字,在函数内部使用defer声明...

  • Golang之Defer

    引用 golang defer实现原理 Golang之轻松化解defer的温柔陷阱 Golang中defer、re...

  • 12 Golang defer panic recover

    defer Golang中的defer会将其后面跟随的语句进行延迟处理。在defer归属的函数即将返回时,将延迟处...

  • golang中defer使用小结

    golang语言中defer的使用场景较多,用于锁的关闭,连接的延迟关闭等,通常在函数的结束时调用,详细的讲就是在...

  • golang中defer的使用

    在golang当中,defer代码块会在函数调用链表中增加一个函数调用。这个函数调用不是普通的函数调用,而是会在函...

  • golang 延时函数defer 作final处理文件或异常

    golang 延时函数defer 作final处理文件或异常defer 函数先进后出原则,在函数内部使用时,会在r...

  • GO中defer关键字

    defer关键字在go中用于return之前执行,在golang官方文档中有说明。defer的用法类似java中的...

  • golang defer问题

    一 函数中间使用defer 二 for循环中间使用defer 三 判断执行没有err之后,再defer释放资源...

网友评论

      本文标题:golang :切忌在循环中直接使用defer

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