精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

為什么 Go 的泛型一拖再拖?

開發 前端
信息匯總來看,Go 泛型這幾年會出,但大體來講現在 Go 泛型又又又推遲了。好家伙,我最早了解到時是考慮 Go1.16 釋出,后面又推到了 Go1.17,接著現在又延期到了 Go1.18 了(2021 年底)。

大家好,我是從不放鴿子的煎魚。

前段時間 Go 語言的泛型討論頻頻出現在各微信群,且又沖上了國內外各大文章的 “頭條”:

信息匯總來看,Go 泛型這幾年會出,但大體來講現在 Go 泛型又又又推遲了。好家伙,我最早了解到時是考慮 Go1.16 釋出,后面又推到了 Go1.17,接著現在又延期到了 Go1.18 了(2021 年底)。

看到了信息的表象后,再想想為什么泛型 “這件事情” 突然醒目起來了,其原因之一是由官方 Go,11 歲[1] 的博文所引爆的。

同時近日舉辦的 GopherCon2020 大會,Robert Griesemer 分享的 Typing [Generic] Go。更正式的讓 Go 泛型更面向了大眾,也側面的說明官方認為其已經到達了一個新的階段了,進入最終實現階段。

事不宜遲,既然官方都已經摩拳擦掌了,我們的學習之路也得跟上,因此本文將會介紹 Go 泛型現在的情況,并通過在介紹過程中不斷思考最后得出一個為什么。

什么是泛型

泛型程序設計(generic programming)是程序設計語言的一種風格或范式。泛型允許程序員在強類型語言中編寫代碼時,使用一些以后才確定的類型,其在真正實例化時才會為這些參數指確定類型。

另外各語言和其編譯器、運行環境對泛型的支持均不一樣,因此需要針對來辯證。

簡單來講,泛型就是參數化多態。其可根據實參類型生成不同的版本,支持任意數量的調用:

  1. func F(a, b T) T{ return a+b } 
  2.  
  3. // T 為 int 
  4. F(1, 2) 
  5.  
  6. // T 為 string 
  7. F("1""2"

在編譯時期編譯器便確定其 T 的入參類型。這也是 Go 泛型實現的要求之一 “編譯時類型安全”。

為什么需要泛型

這時候可能會有人說,沒有泛型也可以啊...感覺寫業務代碼沒什么影響,與其搞泛型不如搞好 errors(具體新消息可參見:重磅:Go errors 將不會有任何進一步的改進計劃)。

但泛型是有其所需的場景,最常見的是像基礎庫在處理獲取配置中心數據時,就要處理類型,時常遇到下述場景:

 

 

手寫一個 “泛型”如果使用接口(interface)類型來做,也得 switch.(type) 枚舉出所有的基礎類型。這顯然并不合理,也沒法做太復雜的邏輯,而且所支持的類型還泄露。

 

另外同時單從語言層面來講,泛型支持是一個必然事件了,因為泛型的存在對解決特定領域的問題存在一定的意義。

接口和泛型有什么區別

在上面我們有提到接口(interface)類型,這時候就出現了泛型的第二個經典問題。那就是 “接口和泛型有什么區別?”,為什么不用接口來實現 “泛型”:

  1. type T interface { ... } 
  2. func F(a, b T) T { return a+b } 

也像這么一回事,但在這里存在一個致命的缺陷。那就是接口的入參和出參均可以在運行時表現為不同的類型:

  1. F("煎魚", 233) 

要做好,還得依靠內部去對參數進行斷言,否則作為 string 類型的煎魚又如何和 int 類型的 233 相加呢,那是必然報錯的。

而反過來看真 “泛型” 的實際使用,編譯器會保證泛型函數的入參和出參必須為同一類型,有強制性的檢驗:

  1. // 報錯:type checking failed for main 
  2. F("煎魚", 233) 
  3.  
  4. // 必須為同一類型,才能正常運行 
  5. F(666, 233) 

兩者存在本質上的區別,泛型會更安全,能夠保證編譯早期就發現錯誤,而不是等到運行時(并且可能會存在隱性的 BUG)。

總體來講,泛型相較接口有如下優點:

  • 更安全:編譯早期就能發現錯誤。
  • 性能好:靜態類型。

過去:為什么那么久都沒有泛型

前幾段在社區的微信群看到一位小伙伴吐槽 “Go 語言居然沒有泛型?”。

變相來看,可能其會認為 ”Go 都已經 11 歲了,2020 年了居然還沒有泛型?”。

這顯然是不對的,因為泛型本質上并不是絕對的必需品,更不是 Go 語言的早期目標,因此在過往的發展階段沒有過多重視這一點,而是把精力放在了其他 feature 上。

另外 Go 語言在以往其實進行過大量的泛型 proposal 試驗,基本時間線(via @changkun)如下:

雖然偶有中斷,但仔細一看,2010 年就嘗試過,現在 2020 年了,也是很勵志了,顯然官方也是在尋路和嘗試的過程中,但一直沒有找到相較好的方案,大多都存在問題,社區對方案的爭議也不斷。

現在:Go 泛型

泛型嘗鮮的方式有兩種方式。線上 Ian Lance Taylor 提供了一個在線編譯的 go2go[2]:

 

另外一種是線下,也就在本地安裝 Go 的特定分支版本:

  1. $ git clone https://github.com/golang/go 
  2. $ git checkout dev.go2go 
  3. $ cd src && ./all.bash 

不過這種本地安裝的方法會耗時比較久,初步嘗試的話建議使用 go2go 就可以了。

而在嘗鮮時,可以看到在代碼塊中聲明了一個 Print 方法,其函數簽名主體分為三部分:

 

 

函數簽名

 

咋一看,變量 T 的這個關鍵字 any 是什么?早期泛型你可能有聽說合約(Contract),難道這就是合約。其實嚴格意義上來講并不是,因為為了更一步簡化語法,合約在 2020.06.07 已經正式移除。

其已改頭換面,現在只需要寫參數化的 interface。而上述的 any 關鍵字是一個預定義的類型約束,聲明后將允許任何類型用作類型實參,并且允許函數使用用于任何類型的操作。

從語法分析的角度來講,Print 方法一共包含了如下屬性(從左到右):

  • type list:聲明了入參的類型列表為一個 T 變量,其可以傳任意類型的參數。
  • parameter list:聲明了入參的參數列表為 T 變量的切片,且形參為 s。
  • return type list:聲明了函數的返回參數列表。

上述函數簽名便是一個 Go 泛型的基本樣子,由于本文并不是 CRUD 泛型,便不展開案例(且現有泛型還不成熟)。

若大家有興趣,強烈建議閱讀提案:Type Parameters - Draft Design[3]。

泛型的戰爭

為什么不用尖括號

在社區中很多同學在討論的一個問題,那就是 “為什么 Go 泛型不像 C++ 和 Java 那樣使用尖括號?,也出現了 “Go 一直標榜業界工程實踐類的榜樣,為什么就是不用尖括號” 的言論?

思考問題我們不只看表面,官方說不行,那么我們可以倒推來看,看看 Go 語言就用尖括號:

  1. func print<type T>(list []T) { 
  2.  
  3. print<int>(numbers) 
  4. print<string>(strings) 
  5. print<float64>(floats) 

普通的函數聲明看上去似乎結構清晰,沒有什么大問題的。接著往下看:

  1. a := w < xb := y > (z) 

我們繼續把代碼演進一下,簡潔一點:

  1. a, b := w < x, y > (z) 

這時候就犯難了,不僅編譯器難以解析,人也很難判別,到底指的是:

  1. a := w < xb := y > (z) 

又或是:

  1. a, b := w(z) 

從上述代碼來看,使用尖括號難以分別,因為沒有類型信息,就無法確定賦值的右側是一對表達式 w < x和y > (z),還是返回兩個結果值 w(z) 的泛型函數實例化和調用,其存在歧義。

要解決還要引入新的約束,會破壞 Go1 的兼容性承諾,這顯然是不合理的。

為什么不用括號

其實最早 Go 泛型的版本是使用了括號的模式,雖然能用,但是用括號會引入新的解析歧義。例如:

  1. var f func(x(T)) 

從語法上來講,你無法識別他是未命名參數的 x(T) 函數,還是類型名為參數的 (T) 函數。

同時 Go 語言還存在強制類型轉換這一語法,假設代碼是 []T(v1) 和 []T(v2){} ,那么你在開括號處,就無法得知其是否代表類型轉換。

甚至在函數的完整聲明上,我們都會感到困惑:

  1. func F(T any)(v T)(r1, r2 T) 

函數入參、泛型、返回值聲明均都是括號,造成了語義不清,這顯然也是不合理的。

為什么不用書名號(«»)

想的美,并不想使用非 ASCII,未來更沒打算支持。

總結

在本文中我們從多個維度介紹了 Go 泛型的相關內容,既了解到了上段時間 Go 泛型再度火爆的信息來源是什么。也知道了 Go 泛型是什么,與接口的區別。

同時我們還針對業界常見的一些疑問,例如接口和泛型的區別,泛型的歷史,泛型的尖括號/括號/書名號之爭進行了解釋和說明。

最后我們回答一下最開始的疑問,”為什么 Go 的泛型一拖再拖“,主要如下:

  • Go 語言的早期目標(工作重點)并不是泛型。
  • Go 語言在 2010-2020 年都有間斷在做 Go 泛型的 proposal,但總是 ”失敗“,在不斷地吸收經驗。
  • Go 語言社區的意見反饋是真的多,單用什么符號表示泛型,不想要泛型都爭論不休。
  • Go 語言的泛型現在還不成熟,很多細節其實并沒有支持好。

很顯然,在保證 Go1 向后兼容性的同時,Go 官方也不想直接妥協出一個隨便的方案,因此總是不斷地在改進。

隨著 Go 語言的在業內的不斷應用,泛型也和 errors 一樣被推上風頭浪尖。

到底拖到什么時候

那 Go 泛型到底什么時候出呢?前段時間也向歐神(@changkun)了解到:

在 GopherCon 2020 Go Team AMA 時,russ cox 有聊到相關問題,表示在明年年底要能有生產環境的試用版上線,這是一個管理目標。

但具體真正的時間線肯定是要看泛型的實現者:robert 和 keith,可以多多關注他們,就能拿到一手信息,且可以確定的是 Go 泛型明年二月之前是不會有生產可用的試用版。

最后,靈魂拷問:你對 Go 語言的泛型又有什么想法和意見呢,一起留言討論吧。

責任編輯:未麗燕 來源: 腦子進煎魚了
相關推薦

2020-03-02 14:18:33

程序員技能開發者

2020-09-27 16:40:29

程序員技術開發

2009-02-12 14:41:00

安騰英特爾惠普

2021-05-27 19:39:58

MWC21世界移動大會移動通信

2015-02-04 10:46:59

AppleWatchuber

2021-09-29 18:17:30

Go泛型語言

2009-06-02 09:16:58

Firefox瀏覽器

2012-06-28 10:48:31

設計交互設計

2011-01-27 09:16:04

微軟云計算

2023-09-06 12:57:11

AI訓練

2018-11-30 16:19:03

App啟動SDK

2025-02-03 12:33:08

2021-12-05 23:45:23

Go泛型Maps

2023-09-18 09:00:59

2011-07-21 15:13:43

機房數據中心服務器

2011-03-01 10:19:10

2010-03-10 09:54:38

APC

2023-11-29 08:19:45

Go泛型缺陷

2015-12-01 10:00:21

2025-08-04 00:00:01

點贊
收藏

51CTO技術棧公眾號

国产精品影视网| 精品视频日韩| 欧美日韩视频免费播放| 欧美一区1区三区3区公司| 中文字幕人妻精品一区| 中文字幕一区二区三区欧美日韩| 欧美精品一区二区三区视频| 草草草在线视频| 性欧美video高清bbw| 91日韩一区二区三区| 国产在线观看一区二区三区 | 欧美精品久久久久久久久| 亚洲专区区免费| 999精品视频在线观看| 高潮白浆女日韩av免费看| 中文字幕中文字幕一区三区| 午夜视频免费看| 国产一区二区福利视频| 国产成人a亚洲精品| 国产小视频在线观看免费| 欧洲grand老妇人| 亚洲国产精品资源| 久久精品亚洲天堂| 欧洲av一区二区| 亚洲国产wwwccc36天堂| 亚洲一区二区三区涩| 性xxxx视频播放免费| 国产精品一区二区果冻传媒| 国产精品色悠悠| 丰满少妇xoxoxo视频| 亚洲性人人天天夜夜摸| 俺去了亚洲欧美日韩| 欧美偷拍一区二区三区| 要久久爱电视剧全集完整观看 | 国产精品中文字幕在线| 国产午夜免费福利| 亚洲国产免费| 欧美激情视频一区二区三区不卡| 亚洲综合久久av一区二区三区| 欧美男同视频网| 亚洲国产精品va在线看黑人动漫| 成人免费播放视频| 成人国产精品一区二区网站| 欧美熟乱第一页| 黄色免费网址大全| 亚洲承认视频| 日本道精品一区二区三区| 能在线观看的av| 日韩脚交footjobhdboots| 亚洲高清免费观看高清完整版在线观看| 在线视频一区观看| 老司机在线视频二区| 国产精品久久久一区麻豆最新章节| 久久精品aaaaaa毛片| 三级在线观看| 久久婷婷久久一区二区三区| 欧美精品一区二区三区久久| 天天综合天天综合| 91一区二区三区在线观看| 国产美女99p| 不卡视频在线播放| 成人一级黄色片| 精品国产一区二区三| 亚洲色图狠狠干| 2021国产精品久久精品| 欧美午夜欧美| 在线观看麻豆| 亚洲另类一区二区| 青草视频在线观看视频| 麻豆免费在线| 在线一区二区三区做爰视频网站| 15—17女人毛片| 外国成人毛片| 精品久久久三级丝袜| 国产网站无遮挡| 精品毛片免费观看| 欧美成人一二三| 日韩三级av在线| 日韩中文字幕亚洲一区二区va在线| 国产精品视频永久免费播放 | 日韩一区和二区| 亚洲一区二区三区黄色| 国产精品一区2区3区| 日韩亚洲欧美中文在线| 久草资源在线视频| 视频精品一区二区| 亚洲mm色国产网站| 三级视频在线播放| 中文字幕亚洲在| 被灌满精子的波多野结衣| 激情开心成人网| 91精品福利在线一区二区三区| 日本国产在线视频| 日本一区二区在线看| 欧美精品电影免费在线观看| 无码人妻丰满熟妇区五十路| 国产一区激情在线| 日韩欧美国产二区| 日本一本在线免费福利| 欧美色图一区二区三区| 性欧美18—19sex性高清| 精品产国自在拍| 欧美激情小视频| 一本一道人人妻人人妻αv| 夫妻av一区二区| 一区二区三区电影| 亚洲天堂免费电影| 日韩欧美高清dvd碟片| 性欧美一区二区| 亚洲网址在线| 91欧美日韩一区| www.av在线播放| 精品成人av一区| 中文字幕 欧美 日韩| 精品国产一区二区三区小蝌蚪 | www.午夜精品| www.国产com| 国产成人综合自拍| 宅男一区二区三区| 亚洲伦乱视频| 亚洲欧美另类国产| 日本一区二区不卡在线| 国产在线观看一区二区| 午夜午夜精品一区二区三区文| 国产美女高潮在线| 精品国产电影一区二区| 成人免费毛片东京热| 久久99久久99| 亚欧精品在线| 成人在线免费av| 亚洲人成网站免费播放| 91浏览器在线观看| zzijzzij亚洲日本少妇熟睡| 中国丰满熟妇xxxx性| 玖玖玖视频精品| 久久天天躁狠狠躁夜夜爽蜜月| 男操女视频网站| 久久九九久精品国产免费直播| 日韩五码在线观看| www.丝袜精品| 性欧美xxxx视频在线观看| 性生活免费网站| 亚洲一级不卡视频| 女同性恋一区二区三区| 激情久久一区| 精品国产91亚洲一区二区三区www| 成人超碰在线| 精品国产乱码91久久久久久网站| 免费在线视频一区二区| 成人永久看片免费视频天堂| 女人被男人躁得好爽免费视频| 美女精品久久| 欧美激情一二三| 天堂a√中文在线| 91黄色免费看| 9.1片黄在线观看| 久久精品72免费观看| 一区精品在线| 视频一区视频二区欧美| 久久久久久亚洲精品不卡| 婷婷综合激情网| 在线国产电影不卡| 美女视频久久久| 国产成人精品免费视频网站| 男人添女人下面高潮视频| 伊人久久大香线蕉| 国产精品日韩在线播放| 国产在线更新| 精品国产髙清在线看国产毛片| 国产精品xxxx喷水欧美| 久久奇米777| 日韩av片专区| 极品av少妇一区二区| 久久久久久艹| 日本电影久久久| 欧美激情第三页| 国产一级网站视频在线| 91精品久久久久久久99蜜桃| 久久中文字幕无码| 2021国产精品久久精品| 欧美又黄又嫩大片a级| 你懂的视频在线免费| 亚洲一级高清| 久久精品ww人人做人人爽| 台湾成人免费视频| 欧美老女人性生活| 精彩国产在线| 这里是久久伊人| 精品国产免费观看| 中文字幕一区二区三区不卡| 一区二区三区四区影院| 久久亚洲视频| 50度灰在线观看| 国产不卡av一区二区| 91久热免费在线视频| 麻豆国产在线| 免费不卡在线观看av| 精品视频一二区| 欧美成人精品3d动漫h| 怡红院av久久久久久久| 夜夜嗨av一区二区三区| 精品熟妇无码av免费久久| 岛国一区二区三区| 天天干天天综合| 一区二区三区福利| 乱子伦一区二区| 成人激情在线| 久久这里只精品最新地址| 久久精品99久久久久久久久| 91亚洲视频在线观看| 欧美日韩一区二区免费在线观看 | 97国产精品视频| 欧美jizzhd欧美| 亚洲乱码国产乱码精品精天堂| 99久久久国产精品无码网爆| 在线看国产一区二区| 国产一级一片免费播放| 亚洲日本电影在线| 99自拍偷拍视频| 91麻豆国产自产在线观看| 师生出轨h灌满了1v1| 久久爱另类一区二区小说| 妺妺窝人体色www在线小说| 91精品天堂福利在线观看| 日韩午夜视频在线观看| 亚洲欧洲美洲国产香蕉| 国产视频99| 精品国产午夜肉伦伦影院| 亚洲va久久久噜噜噜久久天堂| 亚洲电影有码| 国产不卡精品视男人的天堂| 国产精品xx| 8x海外华人永久免费日韩内陆视频| 污污的网站在线看| 免费av一区二区| av毛片在线播放| 欧美成人免费播放| 中文字幕第20页| 红杏aⅴ成人免费视频| 91aaaa| 国产精品久久久久久妇女| 日本欧美在线视频| 一区二区三区短视频| 欧美在线免费观看| 欧美久久天堂| 97在线视频精品| 久热在线观看视频| 欧美一区二区色| 婷婷激情一区| 国产精品香蕉国产| 欧美黑粗硬大| 92看片淫黄大片看国产片| 国产精品视频一区视频二区| 亚洲va欧美va国产综合久久| 精品视频在线观看免费观看| 91蜜桃网站免费观看| a级日韩大片| 鲁鲁视频www一区二区| 免费av一区| 午夜老司机精品| 久久久久亚洲| 国产 欧美 日韩 一区| 国产精品啊啊啊| 美女av免费在线观看| 石原莉奈在线亚洲二区| 在线免费观看av的网站| 久久99久久久欧美国产| 国内自拍偷拍视频| 91麻豆成人久久精品二区三区| 天堂久久精品忘忧草| 中文字幕亚洲在| 久久精品视频国产| 色88888久久久久久影院按摩| 伊人久久久久久久久久久久| 欧美人妖巨大在线| 亚洲av少妇一区二区在线观看| 亚洲激情免费观看| av在线免费播放网站| 久热爱精品视频线路一| caoporn-草棚在线视频最| 国产精品电影网| 日本高清精品| 蜜桃传媒视频麻豆第一区免费观看| 不卡日本视频| 福利视频免费在线观看| 久久九九99| 色哟哟在线观看视频| 91麻豆国产自产在线观看| 小泽玛利亚一区二区免费| 欧美日韩激情小视频| 91av久久久| 亚洲精品99久久久久| 麻豆av在线免费看| 69国产精品成人在线播放| 亚洲一区有码| 免费在线观看91| 一区二区三区在线| 亚洲精品乱码久久久久久自慰| 久久99精品视频| 欧美一区二区三区成人精品| 亚洲天堂免费在线观看视频| 天天综合天天干| 日韩精品一区二区三区视频播放| 深夜视频在线免费| 久久久久久久综合日本| 亚洲自拍的二区三区| 一区久久精品| 亚洲精品永久视频| 久久精品亚洲一区二区三区浴池 | 成人黄色av网| 神马久久一区二区三区| 国产91沈先生在线播放| 久久精品国产精品亚洲综合| 香蕉视频黄色在线观看| 亚洲韩国精品一区| 国产毛片久久久久| 国产一区二区三区视频在线观看 | 欧美亚洲一区二区在线| 成人免费一级视频| 久久九九亚洲综合| 欧美日韩在线精品一区二区三区激情综合 | 久久艹在线视频| 成人h在线观看| 欧美日韩国产三区| 日韩午夜激情| 极品白嫩的小少妇| 亚洲最色的网站| 国产丰满果冻videossex| 最近2019中文字幕mv免费看 | 色综合久久中文综合久久牛| 亚洲国产精品欧美久久 | 亚洲 国产 欧美一区| 久久久久国产精品一区三寸 | 精品乱子伦一区二区| 久久夜色精品亚洲噜噜国产mv| 欧美va在线| 欧美综合激情| 国产精品综合| 三级黄色片网站| 日韩欧美精品中文字幕| 欧美性孕妇孕交| 啪一啪鲁一鲁2019在线视频| 日本国产精品| 色综合av综合无码综合网站| 99久久久久久99| 日韩 欧美 中文| 日韩福利在线播放| 天堂在线中文网官网| 久久亚洲国产精品日日av夜夜| 国产精品夜夜夜| 韩国三级hd中文字幕| 欧美日韩国产美| 精品视频在线一区二区| 91香蕉亚洲精品| 国内成人在线| 第四色在线视频| 一本色道久久综合精品竹菊| 黄色在线视频观看网站| 国产精品爽爽爽爽爽爽在线观看| 欧美综合在线视频观看| 欧美日韩亚洲一区二区| 午夜精品久久久久久久99老熟妇| 欧美成人在线免费| 国产suv精品一区| 好吊妞无缓冲视频观看| 久久久久国产免费免费| 亚洲天堂狠狠干| 久久国产加勒比精品无码| 99ri日韩精品视频| 国产av无码专区亚洲精品| 国产精品午夜免费| 亚洲国产精品久久久久爰性色| 2019中文字幕全在线观看| 成人3d动漫在线观看| 欧洲美女亚洲激情| 精品国产鲁一鲁一区二区张丽| 精品推荐蜜桃传媒| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 中文亚洲字幕| 国产精品理论在线| 日韩欧美激情在线| xx欧美视频| av不卡在线免费观看| 成人精品高清在线| 免费在线不卡av| 九九热精品视频国产| 天天久久夜夜| 国产精品探花在线播放| 天天色图综合网| 欧美猛烈性xbxbxbxb| 精品国产乱码久久久久久丨区2区 精品国产乱码久久久久久蜜柚 | 亚洲精品观看| 国产黄色特级片| 亚洲自拍另类综合| jizz在线观看中文| 国内精品视频免费| 国精产品一区一区三区mba视频 | 在线观看日韩av电影| 中文字幕欧美激情极品| 精品美女在线观看|