Go1.14 都還沒發佈,官方已經準備 Go 1.15 了:它有哪些新東西?


Go1.14 都還沒發佈,官方已經準備 Go 1.15 了:它有哪些新東西?

狀態

已經臨近 Go1.14 發佈了,計劃在 2 月份發佈,RC1 候選版本已經準備好了。根據 Go 2, here we come![1] 這篇文章描述的過程,這到了我們開發和發佈週期考慮的時候,我們是否希望在下一個版本中(Go1.15)增加語言和庫的更改,並計劃於今年 8 月份發佈。

Go 的主要目標仍然是程序包和版本管理,更好的錯誤處理支持以及泛型。模塊支持狀況良好,並且每天都在不斷完善,我們在泛型方面也正在取得進展(今年晚些時候會取得更多進展)。我們七個月前試圖提供更好的錯誤處理機制的嘗試 try proposal[2] 得到了良好的支持,但也遭到了強烈反對,因此我們決定放棄它。在此之後,提出了許多後續建議,但它們似乎都沒有足夠的說服力,明顯優於 try 建議,或者不太可能引起類似的爭議。因此,我們暫時沒有進一步追求錯誤處理的變化。也許將來的一些見識將有助於我們改善現狀。

提案

鑑於模塊和泛型正在積極開發中,並且由於錯誤處理暫時無法進行更改,我們還應該進行其他哪些更改(如果有)?有一些常年性的收藏夾,例如對枚舉和不可變類型的需求,但是這些思想還沒有得到充分發展,它們也沒有足夠緊急以引起 Go 團隊的關注,尤其是在考慮到語言改變的成本時。

在審查了所有可能可行的提案之後,更重要的是,由於我們不想在沒有長期計劃的情況下逐步增加新功能,因此得出結論,這次最好不進行重大更改。取而代之的是,我們專注於幾個新的 “vet” 檢查以及對語言的較小調整。我們選擇了以下 3 個建議:

#32479[3] Diagnose string(int) conversion in go vet

我們計劃在即將發佈的 Go 1.14 版本中做到這一點,然而我們並沒有解決這個問題,因此再次出現。為方便起見,string(int)轉換是在 Go 的早期引入的,但是它使新手感到困惑(string(10)是\\n而不是10),現在已經不合理了。轉換可以在 unicode/utf8包中進行。由於刪除此轉換[4]不是向後兼容的更改,因此我們建議改從 vet 錯誤開始。

#4483[5] Diagnose impossible interface-interface type assertions in go vet

當前,Go 允許接口類型的 x 和 T 進行類型斷言 x.(T)(以及相應的 type swtich case)。但是,如果 x 和 T 具有相同名稱但簽名不同的方法,則分配給 x 的任何值也不能實現 T。這樣的類型斷言將始終在運行時失敗( panic 或返回 false)。由於我們在編譯時就知道這一點,因此編譯器也可能會報告錯誤。在這種情況下,報告編譯器錯誤不是向後兼容的更改,因此,我們還建議從 vet 錯誤開始。

#28591[6] Constant-evaluate index and slice expressions with constant strings and indices

當前,用一個或多個常量索引對一個常量字符串進行索引或切片會分別產生一個非恆定的 字節或字符串值。但是,如果所有操作數都是常量,則編譯器可以對這些表達式進行常量求值,併產生常量(可能是無類型的)結果。這是完全向後兼容的更改,我們建議對規範和編譯器進行必要的調整。

時間規劃

我們認為,這三個提案中沒有一個會引起爭議,但是我們總是有可能錯過一些重要的東西。因此,我們計劃在 Go 1.15 發行週期的開始(在Go 1.14發行時或之後)實施提案,以便有足夠的時間收集經驗並提供反饋。根據提案評估流程[7],最終決定將在2020 年 5 月初的開發週期結束時做出。

還有一件事情。。。

我們收到了更多的語言更改建議(標記為 LanguageChange 的 issue[8]),我們無法對其進行徹底審查。例如,僅就錯誤處理而言,就有 57 個 issue,其中五個 issue 目前仍未解決。由於進行語言更改的成本,無論大小如何,都很高,而且收益往往不清楚,因此我們必須謹慎行事。因此,大多數語言更改建議遲早都會遭到拒絕,有時反饋很少。這可能對相關人來說不滿意。如果你花費大量時間和精力詳細概述了你的想法,立即拒接它肯定是不好的。在另一方面,由於一般的

提案流程[9]刻意保持簡單,因此創建僅很少量的語言更改提案非常容易進行,這導致審查委員會進行了大量工作。為了改善每個人的體驗,我們添加了一個新的 questionnaire[10]:填寫該模板將有助於審閱者對提案進行更有效的評估,因為他們不需要自己嘗試回答這些問題。希望它能從一開始就設定期望,從而為提議者提供更好的指導。這是一個實驗,我們會根據需要隨著時間的推移進行完善。

謝謝您幫助改善 Go 的體驗!

Robert Griesemer, for the Go team

28 January 2020

https://blog.golang.org/go1.15-proposals

[1]

Go 2, here we come!: https://blog.golang.org/go2-here-we-come

[2]

try proposal: https://golang.org/issue/32437

[3]

#32479: https://github.com/golang/go/issues/32479

[4]

刪除此轉換: https://github.com/golang/go/issues/3939

[5]

#4483: https://github.com/golang/go/issues/4483

[6]

#28591: https://github.com/golang/go/issues/28591

[7]

提案評估流程: https://blog.golang.org/go2-here-we-come

[8]

標記為 LanguageChange 的 issue: https://github.com/golang/go/labels/LanguageChange

[9]

提案流程: https://github.com/golang/proposal/blob/master/README.md

[10]

questionnaire: https://github.com/golang/proposal/blob/master/go2-language-changes.md


分享到:


相關文章: