看下面的例子:
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)之前的資源沒有釋放的情況。