看下面的例子:

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

最后修改:2020 年 10 月 02 日 07 : 38 PM
如果觉得我的文章对你有用,请随意赞赏

发表评论

域名代备案/服务器虚拟主机售卖/二级不死域名代制作/
老备案老域名/营业执照代办/QQ互联代申请/
海报宣传图设计/各类程序授权/各类业务

联系QQ:1032066668
点击联系