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

智慧大石
TA貢獻1946條經驗 獲得超3個贊
Go編譯器不知道什么代碼是清理代碼。因此,如果推遲清理代碼有效,那么顯然推遲任何非清理代碼也同樣有效。
延遲函數有一些開銷,顯然必須管理調用堆棧,但如果它使您的代碼更安全和/或更易于閱讀,那就去做吧。在返回之前使用它執行任何操作都是完全可以的,甚至可以修改返回的值,甚至在發生恐慌的情況下也是如此。
您應該記住的一件事:即使代碼發生恐慌(這對于清理代碼來說是可取的),延遲函數也會運行,否則這將不是正常的執行流程。因此,與不使用 defer 相比,使用 defer 會有所不同。

慕桂英3389331
TA貢獻2036條經驗 獲得超8個贊
讓我們非常具體地了解 Go 延遲操作當前(Go 1.14 之前)添加的開銷。
從 Go 1.13 開始,大多數延遲操作大約需要 35ns(從 Go 1.12 中的大約 50ns 減少)。相比之下,直接調用大約需要 6ns。這種差距激勵工程師從熱代碼路徑中消除延遲操作,這會占用更多生產任務的時間,導致代碼的可維護性較差(例如,如果稍后引入恐慌,“優化”將不再正確),并且使人們泄氣當某種語言特性是問題的適當解決方案時,不要使用它。
提案:通過內聯代碼實現低成本延遲,并使用額外的 funcdata 來管理緊急情況
- 2 回答
- 0 關注
- 148 瀏覽
添加回答
舉報
0/150
提交
取消