Go 泛型的括號選擇:[ ] or ( )? - OSCHINA - 中文開源技術交流社區

2021-01-11 開源中國

Go 語言設計者 Robert Griesemer 和 Ian Lance Taylor 近日在 Golang 官方論壇發帖討論關於泛型及其括號使用的問題。

他們提到很多人表達了對泛型語法的擔憂,特別是在類型參數聲明和函數實例以及泛型的括號選擇方面。

常見的計算機鍵盤提供了四對單字符對稱括號,分別是小括號 ( )、方括號 [ ]、花括號 { } 以及尖括號 < >。基於此,他們解釋了目前泛型草案在示例代碼中使用小括號的原因。首先,Go 使用花括號來劃分代碼塊、複合字面量(composite literals)和一些複合類型,因此幾乎不可能在沒有嚴重語法問題的情況下將花括號用於泛型。至於尖括號,解析器在某些情況下要求 <> 需要 unbounded lookahead。

所以只剩下 ( ) 和 [ ] 可供選擇。然而缺少修飾的方括號會在數組和 slice 的類型聲明中造成歧義,在解析索引表達式時也會引起小程度的歧義。因此在設計之初他們決定使用小括號,因為小括號似乎更符合 Go 語言的風格,而且看起來問題最少。

為了使小括號正常工作,並且為了向後兼容,他們表示不得不在類型參數列表中引入type關鍵字。最後,他們在參數列表、複合字面量和嵌入類型中發現了額外的解析歧義,而這些歧義需要嵌套更多的小括號來解決。不過即便如此,他們還是決定繼續使用小括號,因為當時還有更重要的設計問題需要解決。

現在他們決定重新考慮這個最初的決定。如果僅使用方括號聲明類型參數,那麼聲明數組的方式如下所示:

type A [N]E

不過這就無法與泛型的聲明進行區分:

type A[N] E

但如果能接受額外的type關鍵字,那麼歧義就會消失:

type A[type N] E

此外,使用小括號時產生的歧義似乎不會出現在方括號中。下面是一些使用方括號但不需要額外嵌套小括號的例子:

using () using [] func f((T(int)) func f(T[int]) struct{ (T(int)) } struct{ T[int] } interface{ (T(int)) } interface{ T[int] } [](T(int)){} []T[int]{}

為了更好地理解以及進行測試,他們表示將開始對原型實現進行修改,讓泛型能使用小括號或方括號(注意不能同時混用,只能使用其中一種)。這些修改將首先提交到 dev.go2go 分支,最終會出現在 Go playground 上。

Robert 和 Ian 表示,除了使用方括號,還有另外經過充分研究的符號可以選擇,這些方案能讓他們做出更明智的決定。

更多討論查看 https://groups.google.com/forum/#!topic/golang-nuts/7t-Q2vt60J8

相關焦點

  • Go 泛型的括號選擇:[ ] or ( )?
    他們提到很多人表達了對泛型語法的擔憂,特別是在類型參數聲明和函數實例以及泛型的括號選擇方面。常見的計算機鍵盤提供了四對單字符對稱括號,分別是小括號 ( )、方括號 [ ]、花括號 { } 以及尖括號 < >。基於此,他們解釋了目前泛型草案在示例代碼中使用小括號的原因。首先,Go 使用花括號來劃分代碼塊、複合字面量(composite literals)和一些複合類型,因此幾乎不可能在沒有嚴重語法問題的情況下將花括號用於泛型。
  • Go 擺脫了 C,又惹上了 Java? - OSCHINA - 中文開源技術交流社區
    (Go 1.4 已經正式支持 Android)4月份進行的 NYJavaSIG 聚會上 Go 團隊的技術主管經理分享了《Go for Java Programmers》,為 Java 程式設計師提供的 Go 入門指南,正式向 Java 領域進軍了嗎?
  • Go 泛型的括號選擇:「」or ( )?
    他們提到很多人表達了對泛型語法的擔憂,特別是在類型參數聲明和函數實例以及泛型的括號選擇方面。常見的計算機鍵盤提供了四對單字符對稱括號,分別是小括號 ( )、方括號 [ ]、花括號 { } 以及尖括號 < >。基於此,他們解釋了目前泛型草案在示例代碼中使用小括號的原因。
  • Go2:實驗,簡化,出貨! - OSCHINA - 中文開源技術交流社區
    對於Go 2,我們認為最重要的具體主題是錯誤處理,泛型和依賴性。從那時起,我們意識到另一個重要的主題是開發人員工具。本文的其餘部分討論了我們在每個領域的工作如何遵循這條道路。在此過程中,我們將繞道而行,停止檢查Go 1.13中即將發布的錯誤處理技術細節。
  • Delta Lake 進入 Linux 基金會 - OSCHINA - 中文開源技術交流社區
    「將 Delta Lake 引入 Linux 基金會的中立組織之下,將有助於依賴該項目的開源社區開發解決存儲和處理大數據(本地和雲端)的技術」,Linux 基金會戰略計劃副總裁 Michael Dolan 表示。
  • GoLand 2020.3 穩定版發布 - OSCHINA - 中文開源技術交流社區
    下載地址:https://www.jetbrains.com/go/download/改進調試器Dump Goroutines新的 Dump Goroutines 功能讓使用者在調試會話中輕鬆找到堆棧中包含指定字符串的 goroutines,單擊 Dump Goroutines
  • Hutool 2.16.0 發布,Java 工具集 - OSCHINA - 中文開源技術交流社區
    使過濾器抽象度更高HttpConnection支持ProxyStrUtil中某些方法使用CharSequence接口做為參數Setting 拆分配置文件解析為SettingLoaderClassUtil增加getTypeArgument方法,用於獲取泛型屬性類型
  • Git 2.4.3 發布 - OSCHINA - 中文開源技術交流社區
    Git是一個開源的分布式版本控制系統,用以有效、高速的處理從很小到非常大的項目版本管理。開源中國 Git 代碼託管平臺:http://git.oschina.net/Windows下的Git請看這裡:http://www.oschina.net/p/msysgitGit 是 Linus Torvalds 為了幫助管理 Linux 內核開發而開發的一個開放源碼的版本控制軟體
  • zmail 6.1版本更新 - OSCHINA - 中文開源技術交流社區
    Zmail的官方主頁:www.z-email.orgZmail的官方論壇:bbs.z-email.orgZmail的QQ群: 257959126系統要求redhat 6.x centos 6.x 64位最小安裝Zmail安裝說明:概述:(1)該安裝包為一鍵安裝包,方便快捷部署;(2)Zmail是開源郵件技術社區的最新的郵件伺服器軟體包
  • 開源社區的「忌諱」話題 - OSCHINA - 中文開源技術交流社區
    加拿大資深開源技術記者Bruce Byfield較早前發表了一篇名為「開源社區從來不想承認的九大事實」(9 Things That Are Never Admitted About Open
  • SugarCRM:開源與商業的完美結合 - OSCHINA - 中文開源技術交流社區
    其實開源軟體並不鮮見,但和普通開源軟體相比,SugarCRM的一大優勢是對於開源軟體與商業軟體的技術投入相差無幾,開源軟體也能和商用軟體一樣更新 和升級,而在功能上,開源軟體也與商業軟體有70-75%的重疊。兩者的區別是在於商業軟體具備SaaS(軟體在線服務)及售前售後服務,而開源軟體更多 的是依靠社區成員間的相互服務。
  • 開放源碼是開源軟體嗎? - OSCHINA - 中文開源技術交流社區
    所以,與此類似的,在中文裡,我們可以認為:「開放原始碼」是一個動詞+一個名詞。而「開源」則是一個特定的詞彙。作為動詞,我們說將某某軟體開源,是一種行為。作為形容詞,我們稱某某軟體是一個開源(的)軟體,不僅僅是指我們能夠獲取到他的原始碼。
  • Google限制Python使用引熱議 - OSCHINA - 中文開源技術交流社區
    今日,csdn報導的一篇文章「Google將限制Python語言的應用 開發社區熱議」;引發網友的熱烈討論
  • Netflix 的開源文化與技術 - OSCHINA - 中文開源技術交流社區
    在之前的新聞《Netflix企業文化與架構設計》一文中我們介紹了Netflix高擴展的企業文化與架構,而作為一家在線影片租賃提供商Netflix之所以能夠在如此大量的用戶、海量的數據、複雜的拓撲結構下取得成功,離不開其背後的開源文化與技術
  • 開源軟體蓄勢待發 - OSCHINA - 中文開源技術交流社區
    相關內容11家值得關注的開源技術公司優異的技術特性和相對低廉的價格的結合使得開源產品廠商比以往有了更多進入企業網絡的路徑。Likewise公司執行長 Barry Crist 稱:「在網絡泡沫時期,由於Linux比SPARC上的Solaris更為便宜,開源產品逐漸由Unix轉移到了Linux。
  • JavaFX 2012:徹底開源 - OSCHINA - 中文開源技術交流社區
    其中將JavaFX完全開源赫列榜首——在2011年的JavaOne大會上,Oracle已做出保證將開源整個JavaFX平臺。 以下是Richard Bair列出的2012年JavaFX 10大目標: 1.
  • 開源春天,此時不來,更待何時? - OSCHINA - 中文開源技術交流社區
    隨後 Apache 軟體基金會與 OpenStack 基金會相繼出來澄清,表示「開源軟體、開原始碼協作、參與公開電話會議或私人會議以及提供贊助資金都是不受 EAR 約束的活動,因此不應對社區產生影響」。
  • Gitbook,這個開源出書平臺了不起 - OSCHINA - 中文開源技術交流社區
    GitHub充分利用了網際網路的能力,讓開發者可以方便地參與不同的項目,不要說查閱別人的代碼,修改別人的項目,是一種更高層次的交流、對話。就好像《如何閱讀一本書》裡提到的「主動閱讀」,是通過不斷了解作者核心觀念,並提出自己觀點進行碰撞的方式,讓讀者成為一名偉大的讀者。相比紙質書中作者與讀者的對話,GitHub 將兩段代碼撰寫者的溝通顯性化,不再是偷偷在旁邊的注釋裡加入自己的觀點。
  • FineUI(開源版)v4.2.0 發布了! - OSCHINA - 中文開源技術交流社區
    原始碼已經託管到OSC:http://git.oschina.net/sanshi/FineUI FineUI
  • F5 收購 NGINX - OSCHINA - 中文開源技術交流社區
    F5 是應用交付網絡(ADN)領域的全球領先廠商,其解決方案有助於整合不同的技術,以便更好地控制基礎架構,提高應用交付和數據管理能力,並使用戶能夠通過企業桌面系統和智能設備無縫、安全並更快速地接入應用。