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

看下面的例子:

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会在匿名函数结束的时候得到执行,所以这样写就不会出现之前的资源没有释放的情况。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容