AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁 > 科技  > 軟件

業(yè)內(nèi)大佬怒噴:Go 正朝著錯誤的方向發(fā)展

來源: 責(zé)編: 時(shí)間:2024-06-27 07:58:00 110觀看
導(dǎo)讀大家好,國外知名開源大佬 Aliaksandr Valialkin[1],最近針對即將正式發(fā)布的 Go1.23 中的迭代器寫了篇文章[2]怒噴。引起了巨大的社區(qū)熱議。迭代器這一新特性,有認(rèn)同也有否定。無論怎么說,Go 新的復(fù)雜度來了。今天分享他針

大家好,國外知名開源大佬 Aliaksandr Valialkin[1],最近針對即將正式發(fā)布的 Go1.23 中的迭代器寫了篇文章[2]怒噴。引起了巨大的社區(qū)熱議。Q4q28資訊網(wǎng)——每日最新資訊28at.com

迭代器這一新特性,有認(rèn)同也有否定。無論怎么說,Go 新的復(fù)雜度來了。今天分享他針對 Go 在 rsc 當(dāng)權(quán)后的現(xiàn)狀的看法和對迭代器的不滿等看法的文章。Q4q28資訊網(wǎng)——每日最新資訊28at.com

本文原作者 Aliaksandr Valialkin 是 vm、quicktemplate、fastjson、fasthttp、fastcache、easyproto 等的開發(fā)者,也算是較為資深的 Go 工程師了。Q4q28資訊網(wǎng)——每日最新資訊28at.com

Go 編程語言因其易用性而廣為人知。歸功于其精心設(shè)計(jì)的語法、特性和工具,Go 使得編寫任意復(fù)雜度的易于閱讀和維護(hù)的程序成為可能(詳見 GitHub)。Q4q28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片Q4q28資訊網(wǎng)——每日最新資訊28at.com

然而,一些軟件工程師稱 Go 為 “無聊”和 “過時(shí)”,因?yàn)樗鄙傧瘢簃onads、option types、LINQ、borrow checkers、零開銷抽象、面向方面編程、繼承、函數(shù)和運(yùn)算符重載等特性。Q4q28資訊網(wǎng)——每日最新資訊28at.com

雖然這些特性可能簡化特定領(lǐng)域的代碼編寫,但它們除了帶來好處之外,還有額外的成本。Q4q28資訊網(wǎng)——每日最新資訊28at.com

這些特性通常對腦力鍛煉有好處。但在處理生產(chǎn)代碼時(shí),我們不需要額外的心理負(fù)擔(dān),因?yàn)槲覀円呀?jīng)忙于解決業(yè)務(wù)任務(wù)。Q4q28資訊網(wǎng)——每日最新資訊28at.com

所有這些特性的主要成本是:Q4q28資訊網(wǎng)——每日最新資訊28at.com

  • ? 僅僅通過閱讀代碼,就更難理解發(fā)生了什么;
  • ? 調(diào)試這樣的代碼變得更加困難,因?yàn)樾枰^數(shù)十個(gè)非平凡的抽象才能到達(dá)業(yè)務(wù)邏輯;
  • ? 由于這些特性施加的限制,向這樣的代碼添加新功能變得更加困難。

這可能會顯著減慢甚至停止代碼開發(fā)的步伐。這就是 Go 最初沒有這些特性的主要原因。Q4q28資訊網(wǎng)——每日最新資訊28at.com

泛型在 Go1.18 中的引入

不幸的是,這些特性開始出現(xiàn)在最近的 Go 版本中:Q4q28資訊網(wǎng)——每日最新資訊28at.com

泛型已經(jīng)在 Go1.18 中添加。許多軟件工程師希望在 Go 中添加泛型,因?yàn)樗麄冋J(rèn)為這將顯著提高他們在 Go 中的生產(chǎn)力。Q4q28資訊網(wǎng)——每日最新資訊28at.com

自 Go1.18 發(fā)布以來已經(jīng)過去了兩年,但生產(chǎn)力提高的跡象并不明顯。Go 中泛型的總體采用率仍然很低。Q4q28資訊網(wǎng)——每日最新資訊28at.com

為什么?因?yàn)樵诖蠖鄶?shù)實(shí)際的 Go 代碼中并不需要泛型。Q4q28資訊網(wǎng)——每日最新資訊28at.com

另一方面,泛型顯著增加了 Go 語言本身的復(fù)雜性。例如,嘗試?yán)斫夥盒吞砑雍?Go 類型推斷的所有細(xì)節(jié)。它的復(fù)雜性已經(jīng)非常接近 C++ 類型推斷了。Q4q28資訊網(wǎng)——每日最新資訊28at.com

Go 泛型還缺少 C++ 模板中存在的基本特性,例如,Go 泛型不支持泛型類型中的泛型方法。它們也不支持模板特化和模板模板參數(shù),以及許多其他特性,這些特性需要充分利用泛型編程。Q4q28資訊網(wǎng)——每日最新資訊28at.com

Go 1.23 中的迭代器

Range over functions(范圍函數(shù)),即迭代器、生成器或協(xié)程,將在 Go 1.23 中被添加。讓我們更仔細(xì)地看看這個(gè) “特性”。Q4q28資訊網(wǎng)——每日最新資訊28at.com

如果你不熟悉 Go 中的迭代器,那么請閱讀這篇介紹[3]。Q4q28資訊網(wǎng)——每日最新資訊28at.com

本質(zhì)上,這是一種語法糖,允許在具有特殊簽名的函數(shù)上編寫 for ... range 循環(huán)。這聽起來像是一個(gè)很棒的特性,不是嗎?讓我們嘗試弄清楚這個(gè)特性解決了什么實(shí)際問題。Q4q28資訊網(wǎng)——每日最新資訊28at.com

在 Go 中,沒有一種標(biāo)準(zhǔn)的方式來遍歷一系列值。由于缺乏任何約定,最終出現(xiàn)了各種各樣的方法。Q4q28資訊網(wǎng)——每日最新資訊28at.com

每種實(shí)現(xiàn)都做了在當(dāng)時(shí)的上下文中最有意義的事,但孤立的決策導(dǎo)致了用戶的困惑。Q4q28資訊網(wǎng)——每日最新資訊28at.com

以下是一些標(biāo)準(zhǔn)庫中存在的不同迭代方式:Q4q28資訊網(wǎng)——每日最新資訊28at.com

? archive/tar.Reader.NextQ4q28資訊網(wǎng)——每日最新資訊28at.com

? bufio.Reader.ReadByteQ4q28資訊網(wǎng)——每日最新資訊28at.com

? bufio.Scanner.ScanQ4q28資訊網(wǎng)——每日最新資訊28at.com

? container/ring.Ring.DoQ4q28資訊網(wǎng)——每日最新資訊28at.com

? database/sql.RowsQ4q28資訊網(wǎng)——每日最新資訊28at.com

? expvar.DoQ4q28資訊網(wǎng)——每日最新資訊28at.com

? flag.VisitQ4q28資訊網(wǎng)——每日最新資訊28at.com

? go/token.FileSet.IterateQ4q28資訊網(wǎng)——每日最新資訊28at.com

? path/filepath.WalkQ4q28資訊網(wǎng)——每日最新資訊28at.com

? runtime.Frames.NextQ4q28資訊網(wǎng)——每日最新資訊28at.com

? sync.Map.RangeQ4q28資訊網(wǎng)——每日最新資訊28at.com

這些函數(shù)在迭代的細(xì)節(jié)上幾乎沒有一致性。即使在簽名上達(dá)成一致的函數(shù)也不總是同意語義。Q4q28資訊網(wǎng)——每日最新資訊28at.com

例如,大多數(shù)返回 (bool, T) 的迭代函數(shù)遵循 Go 的常規(guī),即第一個(gè) bool 表示第二個(gè) T 是否有效。Q4q28資訊網(wǎng)——每日最新資訊28at.com

與此相反,runtime.Frames.Next 返回的 bool 表示迭代是否繼續(xù)。Q4q28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)你想要遍歷某些內(nèi)容時(shí),你首先必須了解你正在調(diào)用的特定代碼如何處理迭代。這種不一致性阻礙了 Go 的目標(biāo),即在大型代碼庫中輕松移動。Q4q28資訊網(wǎng)——每日最新資訊28at.com

人們經(jīng)常提到所有 Go 代碼看起來都差不多是一種優(yōu)勢。但對于具有自定義迭代的代碼來說,這根本不是真的。Q4q28資訊網(wǎng)——每日最新資訊28at.com

同理,這聽起來是合理的 - 在 Go 中有一種統(tǒng)一的方式來遍歷各種類型。但是,關(guān)于向后兼容性,Go 的主要優(yōu)勢之一呢?Q4q28資訊網(wǎng)——每日最新資訊28at.com

所有上述標(biāo)準(zhǔn)庫中的現(xiàn)有自定義迭代器將根據(jù) Go 兼容性規(guī)則永遠(yuǎn)保留在標(biāo)準(zhǔn)庫中。Q4q28資訊網(wǎng)——每日最新資訊28at.com

因此,所有新的 Go 版本將至少提供兩種不同的方式,在標(biāo)準(zhǔn)庫中遍歷各種類型 - 舊的方式和新的方式。Q4q28資訊網(wǎng)——每日最新資訊28at.com

這增加了 Go 編程的復(fù)雜性,因?yàn)椋?span style="display:none">Q4q28資訊網(wǎng)——每日最新資訊28at.com

  • ? 你需要知道遍歷各種類型時(shí)的兩種方式,而不是單一的方式。
  • ? 你需要能夠閱讀和維護(hù)使用舊迭代器的舊代碼,以及可能使用舊迭代器或新迭代器,或同時(shí)使用兩種迭代器類型的新代碼。
  • ? 當(dāng)你編寫新代碼時(shí),需要選擇適當(dāng)?shù)牡黝愋汀?/li>

Go 1.23 中迭代器的其他問題

直到 Go 1.23,for ... range 循環(huán)只能應(yīng)用于內(nèi)置類型:int(自 Go1.22 起)、string、slice、map 和 channel。Q4q28資訊網(wǎng)——每日最新資訊28at.com

這些循環(huán)的語義清晰易懂(channel 的循環(huán)語義更復(fù)雜,但如果你處理并發(fā)編程,那么你應(yīng)該很容易理解)。Q4q28資訊網(wǎng)——每日最新資訊28at.com

for ... range 循環(huán)現(xiàn)在可以應(yīng)用于函數(shù),這引入了一種新形式的迭代器,稱為 pull 和 push 函數(shù)。Q4q28資訊網(wǎng)——每日最新資訊28at.com

這使得不可能理解給定的無辜循環(huán)體 for ... range 實(shí)際上在背后做什么,因?yàn)樗[式地將循環(huán)體包裝在一個(gè)匿名函數(shù)中,并將其傳遞給 push 迭代器函數(shù)。此外,它隱式地調(diào)用匿名 pull 函數(shù),并將返回的結(jié)果傳遞給循環(huán)體。Q4q28資訊網(wǎng)——每日最新資訊28at.com

這還隱式地轉(zhuǎn)換了 return、continue、break、goto 和 defer 語句為匿名函數(shù)內(nèi)的非顯式語句。Q4q28資訊網(wǎng)——每日最新資訊28at.com

以下是一些示例代碼,展示了新迭代器的使用和潛在問題:Q4q28資訊網(wǎng)——每日最新資訊28at.com

// 舊的顯式回調(diào)方法tree.walk(func(k, v string) { println(k, v) })// 新的 range over function 方法for k, v := range tree.walk { println(k, v) }

請記住,后面的循環(huán)隱式地轉(zhuǎn)換為帶有顯式回調(diào)調(diào)用的前一個(gè)代碼。現(xiàn)在讓我們從循環(huán)中返回一些東西:Q4q28資訊網(wǎng)——每日最新資訊28at.com

for k, v := range tree.walk {  if k == "foo" {    return v  }}

它隱式地轉(zhuǎn)換為類似于以下內(nèi)容的難以追蹤的代碼:Q4q28資訊網(wǎng)——每日最新資訊28at.com

var vOuter stringneedOuterReturn := falsetree.walk(func(k, v string) bool {  if k == "foo" {    needOuterReturn = true    vOuter = strings.Clone(v) // 這里進(jìn)行了內(nèi)存分配和復(fù)制    return false  }})if needOuterReturn {  return vOuter}

如果 tree.walk 通過從字節(jié)切片的不安全轉(zhuǎn)換將 v 傳遞給回調(diào),那么 v 的內(nèi)容可能在下一次循環(huán)迭代中改變。因此,隱式生成的防彈代碼必須使用 strings.Clone(),這可能導(dǎo)致不必要的內(nèi)存分配和復(fù)制。Q4q28資訊網(wǎng)——每日最新資訊28at.com

range over func 特性對函數(shù)簽名施加了限制。這些限制并不適合所有需要迭代集合項(xiàng)的情況。Q4q28資訊網(wǎng)——每日最新資訊28at.com

這迫使軟件工程師在 for ... range 循環(huán)的丑陋 hack 和編寫理想適合給定任務(wù)的顯式代碼之間做出艱難選擇。Q4q28資訊網(wǎng)——每日最新資訊28at.com

結(jié)論

遺憾的是,Go 開始朝著增加復(fù)雜性和隱式代碼執(zhí)行的方向發(fā)展。也許我們需要停止添加增加 Go 復(fù)雜性的特性,而應(yīng)該專注于 Go 的基本特性 - 簡單性、生產(chǎn)力和性能。Q4q28資訊網(wǎng)——每日最新資訊28at.com

例如,最近 Rust 開始在性能關(guān)鍵領(lǐng)域取代 Go 的份額。我相信如果 Go 核心團(tuán)隊(duì)專注于熱點(diǎn)循環(huán)的優(yōu)化,如循環(huán)展開和 SIMD 使用,這種趨勢可以逆轉(zhuǎn)。Q4q28資訊網(wǎng)——每日最新資訊28at.com

這不應(yīng)該太影響編譯和鏈接速度,因?yàn)橹挥幸恍〔糠志幾g的 Go 代碼需要優(yōu)化。沒有必要優(yōu)化所有變體的愚蠢代碼 - 這些代碼即使在優(yōu)化熱點(diǎn)循環(huán)之后,仍然會很慢。Q4q28資訊網(wǎng)——每日最新資訊28at.com

只優(yōu)化軟件工程師有意編寫的特定模式就足夠了,他們關(guān)心他們的代碼性能。Q4q28資訊網(wǎng)——每日最新資訊28at.com

Go 比 Rust 更容易使用。我們?yōu)槭裁匆谛阅芨傎愔休斀o Rust?Q4q28資訊網(wǎng)——每日最新資訊28at.com

另一個(gè) Go 可以在不增加語言本身復(fù)雜性和使用這些特性的 Go 代碼復(fù)雜性的情況下獲得的有用特性的例子,是類似于這個(gè)的小生活質(zhì)量改進(jìn)。Q4q28資訊網(wǎng)——每日最新資訊28at.com

我是誰?

我是 VictoriaMetrics、quicktemplate、fastjson、fasthttp、fastcache、easyproto 等的開發(fā)者。感謝 Go,我一直在嘗試遵循 KISS 設(shè)計(jì)原則。Q4q28資訊網(wǎng)——每日最新資訊28at.com

引用鏈接

[1] Aliaksandr Valialkin: https://github.com/valyalaQ4q28資訊網(wǎng)——每日最新資訊28at.com

[2] 文章: https://itnext.io/go-evolves-in-the-wrong-direction-7dfda8a1a620Q4q28資訊網(wǎng)——每日最新資訊28at.com

[3] 介紹: https://bitfieldconsulting.com/posts/iteratorsQ4q28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-96764-0.html業(yè)內(nèi)大佬怒噴:Go 正朝著錯誤的方向發(fā)展

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: CSS的媒體查詢:響應(yīng)式布局的利器

下一篇: 聊聊性能指標(biāo)CPU利用率如何計(jì)算的?

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 小米平板5 Pro 12.4簡評:多專多能 兼顧影音娛樂的大屏利器

    疫情帶來了網(wǎng)課,網(wǎng)課盤活了安卓平板,安卓平板市場雖然中途停滯了幾年,但好的一點(diǎn)就是停滯的這幾年行業(yè)又有了新的發(fā)展方向,例如超窄邊框、高刷新率、多攝鏡頭組合等,這就讓安卓
  • 5月安卓手機(jī)好評榜:魅族20 Pro奪冠

    性能榜和性價(jià)比榜之后,我們來看最后的安卓手機(jī)好評榜,數(shù)據(jù)來源安兔兔評測,收集時(shí)間2023年5月1日至5月31日,僅限國內(nèi)市場。第一名:魅族20 Pro好評率:97.50%不得不感慨魅族老品牌還
  • 5月iOS設(shè)備好評榜:iPhone 14僅排第43?

    來到新的一月,安兔兔的各個(gè)榜單又重新匯總了數(shù)據(jù),像安卓陣營的榜單都有著比較大的變動,不過iOS由于設(shè)備的更新?lián)Q代并沒有那么快,所以相對來說變化并不大,特別是iOS好評榜,老款設(shè)
  • 一年經(jīng)驗(yàn)在二線城市面試后端的經(jīng)驗(yàn)分享

    忠告這篇文章只適合2年內(nèi)工作經(jīng)驗(yàn)、甚至沒有工作經(jīng)驗(yàn)的朋友閱讀。如果你是2年以上工作經(jīng)驗(yàn),請果斷劃走,對你沒啥幫助~主人公這篇文章內(nèi)容來自 「升職加薪」星球星友 的投稿,坐
  • Java NIO內(nèi)存映射文件:提高文件讀寫效率的優(yōu)秀實(shí)踐!

    Java的NIO庫提供了內(nèi)存映射文件的支持,它可以將文件映射到內(nèi)存中,從而可以更快地讀取和寫入文件數(shù)據(jù)。本文將對Java內(nèi)存映射文件進(jìn)行詳細(xì)的介紹和演示。內(nèi)存映射文件概述內(nèi)存
  • 一文搞定Java NIO,以及各種奇葩流

    大家好,我是哪吒。很多朋友問我,如何才能學(xué)好IO流,對各種流的概念,云里霧里的,不求甚解。用到的時(shí)候,現(xiàn)百度,功能雖然實(shí)現(xiàn)了,但是為什么用這個(gè)?不知道。更別說效率問題了~下次再遇到,
  • 拼多多APP上線本地生活入口,群雄逐鹿萬億市場

    Tech星球(微信ID:tech618)文 | 陳橋輝 Tech星球獨(dú)家獲悉,拼多多在其APP內(nèi)上線了“本地生活”入口,位置較深,位于首頁的“充值中心”內(nèi),目前主要售賣美食相關(guān)的
  • 新電商三兄弟,“抖快紅”成團(tuán)!

    來源:價(jià)值研究所作 者:Hernanderz 隨著內(nèi)容電商的概念興起,抖音、快手、小紅書組成的“新電商三兄弟”成為業(yè)內(nèi)一股不可忽視的勢力,給阿里、京東、拼多多帶去了巨大壓
  • 三星Galaxy Z Fold5今日亮相:厚度縮減但仍略顯厚重

    據(jù)官方此前宣布,三星將于7月26日也就是今天在韓國首爾舉辦Unpacked活動,屆時(shí)將帶來帶來包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy
Top