golang :切忌在循環(huán)中直接使用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()
        //...
}

由于這是一個死循環(huán),defer代碼不會被執(zhí)行到,所以申請的內存得不到釋放,然后會導致程序占滿整個內存,死機。 注意這里需要強調的是直接使用,如果是封裝到匿名函數(shù)中,結果就不一樣了

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會在匿名函數(shù)結束的時候得到執(zhí)行,所以這樣寫就不會出現(xiàn)之前的資源沒有釋放的情況。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容