Go 泛型的括號選擇:「」or ( )?

2020-12-16 開源中國

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

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

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

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

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

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

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

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

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

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

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

相關焦點

  • Go 泛型的括號選擇:[ ] or ( )?
    他們提到很多人表達了對泛型語法的擔憂,特別是在類型參數聲明和函數實例以及泛型的括號選擇方面。常見的計算機鍵盤提供了四對單字符對稱括號,分別是小括號 ( )、方括號 [ ]、花括號 { } 以及尖括號 < >。基於此,他們解釋了目前泛型草案在示例代碼中使用小括號的原因。首先,Go 使用花括號來劃分代碼塊、複合字面量(composite literals)和一些複合類型,因此幾乎不可能在沒有嚴重語法問題的情況下將花括號用於泛型。
  • Go 泛型的括號選擇:[ ] or ( )? - OSCHINA - 中文開源技術交流社區
    他們提到很多人表達了對泛型語法的擔憂,特別是在類型參數聲明和函數實例以及泛型的括號選擇方面。常見的計算機鍵盤提供了四對單字符對稱括號,分別是小括號 ( )、方括號 [ ]、花括號 { } 以及尖括號 < >。基於此,他們解釋了目前泛型草案在示例代碼中使用小括號的原因。首先,Go 使用花括號來劃分代碼塊、複合字面量(composite literals)和一些複合類型,因此幾乎不可能在沒有嚴重語法問題的情況下將花括號用於泛型。
  • 掃盲:Kotlin 的泛型
    由於 Java 的泛型本身是一種 「偽泛型」,Java 為了兼容 1.5 以前的版本,不得以在泛型底層實現上使用 Object 引用,所以我們聲明的泛型在編譯時會發生「類型擦除」,泛型類型會被 Object 類型取代。
  • 「」還是『』?日語寫作中括號的使用方法
    日語和中文不同,引用對話的內容時多使用「」而不是雙引號「」,表示書名或電影名時會使用 『 』而不是書名號《》……一起來看看日語中常用括號的使用方法吧。 防止把「おこなう」誤讀成「いく」,因此特別標出讀音。 二、 「 」 1.用來標註對話。 例:「これをください」と店員さんに言いました。 2.用來表示強調。 例:何よりも「お金」がほしいです。 3.用來表示專有名詞。
  • 看懂複雜的TypeScript泛型運算
    但是,當不得不嘗試提高函數或組件的通用性時,使用泛型成了必須的選擇。當嘗試閱讀一些用TypeScript開發的庫的源碼時,可能會被各種尖括號包裹的複雜泛型運算搞的暈頭轉向。本文的目的在於對泛型中的常見關鍵詞和用法進行介紹,並且嘗試用一定數量的例子來方便理解泛型。閱讀本文之前,希望你已經閱讀過TypeScript官方文檔[1]。
  • 如何實現Go泛型的討論 | Gopher Daily (2020.09.19) ʕ◔ϖ◔ʔ
    •有意想學習容器或Kubernets的童鞋可以了解一下我的慕課網實戰課:k8s實戰 - https://coding.imooc.com/class/284.html1.Go泛型如何實現的討論 - https://groups.google.com/g/golang-dev/c/OcW0ATRS4oM 以及Keith Randall提出的兩個實現方案
  • 3 分鐘帶你徹底搞懂 Java 泛型背後的秘密
    是的,沒錯,因為泛型只是為了約束我們規範代碼,而對於編譯完之後的class交給虛擬機後,對於虛擬機它是沒有泛型的說法的,所有的泛型在它看來都是object類型,因此泛型擦除是對於虛擬機而言的。這裡我將泛型加了個關鍵字extends,對於泛型寫得多的夥伴們來說,extends是約束了泛型是向下繼承的,最後我們通過反射獲取value的類型是String類型的,因此這裡也不難看出,加extends關鍵字其實最終目的是約束泛型是屬於哪一類的。
  • 泛型:泛型的定義(類、接口、對象)、使用、繼承
    泛型(Generic):就是指參數化類型,上面的List<String>就是參數化類型,因此就是泛型,而String就是該List<String>泛型的類型參數;    3) 泛型的好處:         i.
  • Go 泛型草案更新,明年 8 月發布的 Go 1.17 將引入
    Go 團隊近日在博客介紹了 Go 泛型的最新進展。Go 團隊表示他們一直在完善泛型的設計草案,並為此編寫了一個類型檢查器——可按照設計草案中的說明,解析使用泛型的 Go 代碼並報告任何類型的錯誤。根據收集的反饋和了解的信息,Go 團隊發布了更新後的泛型設計草案。
  • Java泛型簡單的使用
    Java裡面的泛型在實際開發中運用的很多,學過C++的同學一定知道C++的模板,而Java中的泛型,一定程度上和它還是挺像的。
  • 初創公司「Onsitego」獲...
    「Onsitego」官網據外媒 yourstory報導,售後服務初創公司「Onsitego」近日完成了 1900 萬美元的 B 輪融資,本輪融資由 Zodius Growth Fund 領投,現有投資者 Accel
  • Afterglow第6張單曲「Easy come,Easy go!」今天發售!
    Afterglow第6張單曲「Easy come,Easy go!」今天發售!動漫 178動漫原創 ▪ 2020-03-11 16:24:01 手遊「BanG
  • 為什麼我會捨棄 Python 依靠 Go?
    缺點我讀到的許多批評 Go 語言的文章都在說它缺乏某個明顯的功能,比如泛型。但沒有泛型我也從來沒遇到過麻煩。實際上 map 和 slice 能完成許多工作。舉兩個近幾年我發現的例子:當然,一些原因是因為 Go 沒有泛型,一些是因為 Go 的設計思想就是只把絕對必要的東西加到標準庫中。我理解這兩個原因,不過在遇到非常簡單的功能卻不得不自己寫代碼時還是覺得很煩人。希望 Go 語言能越來越好,痛點能越來越少。
  • Android開發小竅門通過泛型簡化findViewById類型轉換
    公眾號:smart_android作者:耿廣龍|loonggg點擊「閱讀原文」,可查看更多內容和乾貨我相信在移動開發最重要的一件事,也是相當麻煩的一件事就是寫布局,對於Android開發者來說,寫布局耗費了大量時間,然後初始化控制項,寫findViewById去類型轉換也是耽誤了很多時間,今天就告訴你一個小竅門,通過泛型來簡化
  • 計算機泛型
    當我們不知道往集合裡面放入什麼數據時候,當這種情況出現時,我們考慮的就是泛型。何為泛型?通俗點說:一個模型,不固定的模型,但我們要提前準備好這個模型,如果對應遊戲裡面的規則的話,就是所謂的預判,我們把這個模型準備了,當我們需要用到的時候,直接使用這個模型改造成自己想要的模樣。
  • Java泛型簡明教程
    儘管有這麼多豐富的資料,有時我感覺,有很多的程式設計師仍然不太明白Java泛型的功用和意義。這就是為什麼我想使用一種最簡單的形式來總結一下程式設計師需要知道的關於Java泛型的最基本的知識。相對於依賴程式設計師來記住對象類型、執行類型轉換——這會導致程序運行時的失敗,很難調試和解決,而編譯器能夠幫助程式設計師在編譯時強制進行大量的類型檢查,發現其中的錯誤。泛型的構成由泛型的構成引出了一個類型變量的概念。
  • Java泛型解析,了解泛型使用
    Java 泛型泛型的本質是參數化類型。簡單解釋就是,將參數的數據類型也當作參數對待。泛型的目的就是為了寫一套代碼,可以到處通用,不用擔心類型安全的問題。泛型可以用在類、接口、方法中對應的就是泛型類、泛型接口和泛型方法。一、為什麼要引入泛型?
  • Hello Go!
    經常看到一堆 err check 代碼夾雜在代碼邏輯裡暫時沒有泛型,某些場景下比較繁瑣生態不夠完善等。Go 還是比較年輕的語言,生態相比一些發展較久的語言還相對欠缺GC,實際上 go 在垃圾回收上比當年改善非常多,web 後端上基本不是個問題總得來說,筆者感覺作為微服務後端語言來說,還是完全夠用的。
  • 「」符號怎麼打?
    Windows 系統:第一步你需要一個第三方輸入法(QQ輸入法、搜狗都可)第二步 打開屬性設置第三步 打開詞庫管理第四步 選擇自定義短語>第五步 添加後,「縮寫」輸入「yh」代表引號,可自定義「自定義短語」輸入「「」」,保存修改第六步 完成手機(ios):第一步 打開設置第二步
  • 重度使用 Go 的「後遺症「,你有嗎?
    Go設計者當初為了簡化代碼編寫,提高代碼可讀性,選擇了由編譯器在詞法分析階段自動在適當位置插入分號的技術路線,並在Go語言規範中描述了分號的插入規則:1.為支持在一個代碼行中放置複雜語句,分號可能被插入在右小括號)或者右大括號}之前。被Go編譯器慣壞了的Gopher們一旦回到編寫C/C++代碼,遺忘代碼行尾的分號的「後遺症」行為就見怪不怪了。•發病指數:5•危害指數:24.