1 回答

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超4個(gè)贊
上面的代碼嘗試重用 object by
SetFinalizer
,但調(diào)試后我發(fā)現(xiàn) finalizer 從未被調(diào)用,為什么?
僅當(dāng) GC 將對(duì)象標(biāo)記為未使用時(shí)才會(huì)調(diào)用終結(jié)器,然后在 GC 周期結(jié)束時(shí)嘗試清掃(釋放)。
作為必然結(jié)果,如果在程序運(yùn)行期間從未執(zhí)行 GC 循環(huán),則可能永遠(yuǎn)不會(huì)調(diào)用您設(shè)置的終結(jié)器。
以防萬一您可能對(duì) Go 的 GC 持有錯(cuò)誤的假設(shè),可能值得注意的是 Go 不對(duì)值使用引用計(jì)數(shù);相反,它使用與程序并行工作的 GC,并且它工作的會(huì)話定期發(fā)生,并由某些參數(shù)觸發(fā),例如分配產(chǎn)生的堆壓力。
關(guān)于終結(jié)器的一些注釋:
當(dāng)程序終止時(shí),不會(huì)強(qiáng)制運(yùn)行 GC。
這樣做的一個(gè)必然結(jié)果是終結(jié)器根本不能保證運(yùn)行。
如果 GC 在將要釋放的對(duì)象上找到終結(jié)器,它會(huì)調(diào)用終結(jié)器但不會(huì)釋放該對(duì)象。
對(duì)象本身只會(huì)在下一個(gè) GC 周期被釋放——浪費(fèi)內(nèi)存。
總而言之,您看起來像是在嘗試實(shí)現(xiàn)析構(gòu)函數(shù)。請(qǐng)不要:讓你的對(duì)象實(shí)現(xiàn)被調(diào)用的那種標(biāo)準(zhǔn)方法,Close
并在你的類型的契約中聲明程序員在完成對(duì)象時(shí)需要調(diào)用它。當(dāng)程序員無論如何都想調(diào)用這樣的方法時(shí),他們會(huì)使用defer
.
請(qǐng)注意,這種方法非常適用于 Go stdlib 中的所有類型,這些類型包裝了操作系統(tǒng)提供的資源——文件和套接字描述符。所以沒有必要假裝你的類型有什么不同。
要記住的另一件有用的事情是,Go 被明確設(shè)計(jì)為嚴(yán)肅、簡(jiǎn)潔、沒有魔法、面對(duì)面的語言,而您只是想為其添加魔法。請(qǐng)不要,那些喜歡解密魔法層的人會(huì)使用Scala不同的語言進(jìn)行編程。
- 1 回答
- 0 關(guān)注
- 168 瀏覽
添加回答
舉報(bào)