閉包(closure)也是很常見的編碼模式,因它隱式攜帶上下文環境變量,所以可以讓算法代碼變得更加簡潔。算法
但任何 「便利」 和 「優雅」 的背後,每每都是更復雜的實現機制,無非是語法糖或編譯器隱藏了相關細節。最終,這些都會變成額外成本在運行期由 CPU、runtime 負擔。甚至因不合理使用,形成性能問題。閉包
用幾個代碼片斷看看可能的麻煩。函數
單次調用的性能差別有點大(不一樣環境結果會不一樣),但這會不會和匿名函數自己構建有關?性能
彷佛是這樣。可接下來的問題就更麻煩了。(代碼僅做演示,並未保證邏輯一致)學習
首先,閉包引用原環境變量,致使 y 逃逸到堆上,這必然增長了 GC 掃描和回收對象的數量。編碼
接下來,一樣是由於閉包引用原對象,形成數據競爭(data race)。spa
可見,閉包未必總能將事情 「簡單化」。在學習 Go 底層實現過程當中,你會了解到,全部 「簡單」 都是由編譯器或運行時用一堆複雜過程堆出來的。對象
最新動態,請掃碼關注圖片