我想在Go 2.0中看到什麼? - sethvargo

banq 發表於 2022-01-18
Go

Go 是我最喜歡的程式語言之一,但它仍然遠非完美。在過去的 10 年裡,我使用 Go 來構建小型專案和大型應用程式。雖然該語言與 2009 年的原始版本相比有了很大的發展,但這篇文章強調了一些我認為 Go 仍有改進空間的領域。

 

現代模板引擎

Go 標準庫有兩個模板包:text/templatehtml/template. 它們使用大致相同的語法,但html/template處理實體轉義和一些其他特定於 Web 的構造。不幸的是,對於沒有大量開發人員投資的足夠高階的用例來說,這兩個包都不適合或足夠強大。

 

改進range以免複製值

雖然它有很好的文件記錄,但是range子句中的值被複制總是出乎意料的。

 

確定性 select

在一個select語句的多個條件為真的情況下,獲勝的情況是 undefined。這是一個非常微妙的錯誤來源,並且看起來相似的switch宣告會加劇這種情況,該宣告確實按照編寫順序進行評估。

 

結構化日誌介面

Go 的標準庫包含這個log包,它非常適合基本使用。但是,大多數生產系統都需要結構化日誌記錄,而Go 中不乏結構化日誌記錄庫:

Go 在這個領域缺乏意見導致了這些包的泛濫,其中大多數具有不相容的功能和簽名。

Go 標準庫需要定義一個結構化的日誌介面,所有這些現有的上游包都可以選擇實現該介面。

 

多錯誤處理

在很多情況下,特別是對於後臺作業或週期性任務,系統可能會並行處理事物或繼續出錯。在這些情況下,返回多重錯誤會很有幫助。標準庫中沒有對處理錯誤集合的內建支援。

圍繞多錯誤處理擁有清晰簡潔的標準庫定義可以統一社群並降低錯誤處理不當的風險,正如我們在錯誤包裝和展開中看到的那樣。

  

JSON序列號 error

 

標準庫中不再有公共變數

僅舉一個例子,http.DefaultClient和http.DefaultTransport都是具有共享狀態的全域性變數。http.DefaultClient沒有配置超時,這使得DOS 自己的服務變得微不足道並造成瓶頸。許多包會發生變異如http.DefaultClient,http.DefaultTransport,這可能會浪費數天的開發人員資源來追蹤錯誤。

Go 2.0 應該將它們設為私有並通過函式呼叫公開它們,該函式呼叫返回所討論變數的唯一分配。或者,Go 2.0 可以實現“凍結”全域性變數,這樣它們就不會被其他包改變。

 

對緩衝渲染器的本機支援

點選標題見原文

本文作者Seth Vargo 是Google的一名工程師。此前,他曾在 HashiCorp、Chef Software、CustomInk 和一些匹茲堡的初創公司工作。他是Learning Chef的作者,熱衷於減少技術上的不平等。當他不寫作、從事開源工作、教學或在會議上發言時,Seth 會為非營利組織提供建議。