第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go 中的終結器測試

Go 中的終結器測試

Go
ITMISS 2021-10-18 14:10:08
有沒有辦法合理地編寫測試用例來測試終結器行為?我正在嘗試在 Go 中實現一個內存敏感的規(guī)范化映射/緩存。由于沒有“軟引用”的概念(并且因為我的對象圖將始終形成一個 DAG),因此我使用一個跟蹤用戶空間中引用計數的微小界面/框架來完成此操作:type ReferenceCounted interface {   RefCount() int   IncRef()   DecRef() (bool, error)}type Finalizable interface {   ReferenceCounted   Finalize()}type AbstractCounted struct {     // unexported fields}它的工作方式是你有一個嵌入 AbstractCounted 的結構,并實現Finalizable.Finalize()- 這些一起使該結構接收Finalizable接口。然后有一個函數func MakeRef(obj Finalizable) *Reference返回一個指向結構的指針,該結構接收一個方法func Get() Finalizable,它獲取引用目標,并通過增加底層對象的引用計數來初始化它,然后設置一個終結器(via runtime.SetFinalizer())來減少引用。 AbstractCounted的Finalizable實現反過來調用Finalize()結構,當引用計數達到零時嵌入它。所以,一切都被設置得非常像 Java 中的軟引用/引用隊列,除了它是引用計數,而不是根植于活動詞法范圍的標記/掃描,它可以“軟”地找到可訪問的東西??雌饋硇Ч芎?!但是 - 我想寫一個測試用例......我完全理解終結器調用被推遲,并且不保證按照reflect包文檔運行它們。在其他具有運行時 gc 和終結器(C#、VB、Java、Python 等)的語言中,情況也是如此。但是,在所有其他語言中,請求顯式 GC(此處通過runtime.GC()函數)似乎確實會導致終結器運行。由于在 Go 中不是這種情況,我無法想出一種方法來編寫將觸發(fā)終結器的測試用例。是否有任何技巧或代碼片段(我認為這取決于當前的實現,即可能在未來中斷?。┛梢钥煽康赜|發(fā)這些終結器,以便我可以編寫我的測試?
查看完整描述

1 回答

?
jeck貓

TA貢獻1909條經驗 獲得超7個贊

您無法顯式觸發(fā)終結器,因此您可以管理的最佳方法是確保 GC 以 啟動runtime.GC(),并等待終結器運行。


如果您查看runtime/mfinal_test.go,有一些測試通過通道等待終結器調用:


runtime.SetFinalizer(y, func(z *objtype) { fin <- true })

runtime.GC()

select {

case <-fin:

case <-time.After(4 * time.Second):

    t.Errorf("finalizer of next string in memory didn't run")

}


查看完整回答
反對 回復 2021-10-18
  • 1 回答
  • 0 關注
  • 182 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號