看下面的例子:
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()
//...
}
由于這是一個(gè)死循環(huán),defer代碼不會(huì)被執(zhí)行到,所以申請(qǐng)的內(nèi)存得不到釋放,然后會(huì)導(dǎo)致程序占滿整個(gè)內(nèi)存,死機(jī)。 注意這里需要強(qiáng)調(diào)的是直接使用,如果是封裝到匿名函數(shù)中,結(jié)果就不一樣了
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會(huì)在匿名函數(shù)結(jié)束的時(shí)候得到執(zhí)行,所以這樣寫(xiě)就不會(huì)出現(xiàn)之前的資源沒(méi)有釋放的情況。