1 回答

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