亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

延遲不僅用于清理 - 好還是壞的做法?

延遲不僅用于清理 - 好還是壞的做法?

Go
喵喔喔 2023-07-26 17:40:27
Go 中通常使用延遲執行代碼來清理資源。它并不常見,但defer也經常用于執行常規業務邏輯。就像執行的最后一步一樣,無論函數在哪一點命中return關鍵字。在Go 博客頁面上,我們可以發現“?defer 語句將函數調用推送到列表中。保存的調用列表在周圍函數返回后執行。Defer 通常用于簡化執行各種清理操作的函數。?”他們確實提到了清理,但沒有提到常規代碼執行。顯然,它可以執行任意代碼,不必進行清理。但這是最佳實踐嗎?社區是否就這方面的慣例或最佳實踐達成一致?
查看完整描述

2 回答

?
智慧大石

TA貢獻1946條經驗 獲得超3個贊

Go編譯器不知道什么代碼是清理代碼。因此,如果推遲清理代碼有效,那么顯然推遲任何非清理代碼也同樣有效。

延遲函數有一些開銷,顯然必須管理調用堆棧,但如果它使您的代碼更安全和/或更易于閱讀,那就去做吧。在返回之前使用它執行任何操作都是完全可以的,甚至可以修改返回的值,甚至在發生恐慌的情況下也是如此。

您應該記住的一件事:即使代碼發生恐慌(這對于清理代碼來說是可取的),延遲函數也會運行,否則這將不是正常的執行流程。因此,與不使用 defer 相比,使用 defer 會有所不同。


查看完整回答
反對 回復 2023-07-26
?
慕桂英3389331

TA貢獻2036條經驗 獲得超8個贊

讓我們非常具體地了解 Go 延遲操作當前(Go 1.14 之前)添加的開銷。

從 Go 1.13 開始,大多數延遲操作大約需要 35ns(從 Go 1.12 中的大約 50ns 減少)。相比之下,直接調用大約需要 6ns。這種差距激勵工程師從熱代碼路徑中消除延遲操作,這會占用更多生產任務的時間,導致代碼的可維護性較差(例如,如果稍后引入恐慌,“優化”將不再正確),并且使人們泄氣當某種語言特性是問題的適當解決方案時,不要使用它。

提案:通過內聯代碼實現低成本延遲,并使用額外的 funcdata 來管理緊急情況


查看完整回答
反對 回復 2023-07-26
  • 2 回答
  • 0 關注
  • 148 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

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

公眾號

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