中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

比Python還好用的Go語(yǔ)言要出2.0了,你想怎么設(shè)計(jì)?

2018-08-29    來(lái)源:raincent

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬(wàn)Linux鏡像隨意使用

Go 語(yǔ)言在工業(yè)上有非常多的應(yīng)用,包括分布式系統(tǒng)和云計(jì)算平臺(tái)等。而 Go 語(yǔ)言并行性能高、部署方便和簡(jiǎn)單便捷等特性令其在一些應(yīng)用上超過(guò)了 Python,我們也曾討論過(guò)由 Python 轉(zhuǎn)向 Go 的 9 大原因。近日在 Go 語(yǔ)言的開發(fā)峰會(huì)上,谷歌發(fā)布了 Go 2 的設(shè)計(jì)草案,包括對(duì)泛型、錯(cuò)誤處理和錯(cuò)誤值語(yǔ)義等發(fā)展的討論。

在昨天的 Go contributor 年度峰會(huì)上,與會(huì)者對(duì)錯(cuò)誤處理和泛型的設(shè)計(jì)草案有了一個(gè)初步的了解。Go 2 的開發(fā)項(xiàng)目是去年宣布的,今天谷歌公布了這一語(yǔ)言的更新。

欲快速了解相關(guān)內(nèi)容,請(qǐng)看谷歌在 Gophercon 2018 上播放的視頻:
 

作為 Go 2 設(shè)計(jì)進(jìn)程的一部分,谷歌發(fā)布了這些設(shè)計(jì)草案,以激發(fā)社區(qū)關(guān)于以下三個(gè)話題的討論:泛型(generics)、錯(cuò)誤處理和錯(cuò)誤值語(yǔ)義(error value semantics)。

這些設(shè)計(jì)草案不算 Go 提案流程意義上的提案。它們只是激發(fā)討論的引子,最終目的是給出足夠好的設(shè)計(jì)并將其轉(zhuǎn)變?yōu)閷?shí)際提案。每種設(shè)計(jì)草案都附帶一個(gè)「問(wèn)題概述」,其作用是:(1)提供語(yǔ)境;(2)為包含更多設(shè)計(jì)細(xì)節(jié)的實(shí)際設(shè)計(jì)文檔做準(zhǔn)備;(3)推動(dòng)關(guān)于設(shè)計(jì)框架和說(shuō)明的討論。問(wèn)題概述會(huì)提供背景、目標(biāo)、非目標(biāo)、設(shè)計(jì)約束、設(shè)計(jì)的簡(jiǎn)要總結(jié)、對(duì)重點(diǎn)關(guān)注領(lǐng)域的簡(jiǎn)短討論以及與先前方法的比較。

再次重申,這些只是設(shè)計(jì)草案,不是官方提案,F(xiàn)在沒(méi)有相關(guān)提案事宜。谷歌希望 Go 的所有用戶都能夠幫助其改進(jìn)草案并將草案完善為 Go 提案。為此,谷歌創(chuàng)建了一個(gè) wiki 頁(yè)面來(lái)收集并組織關(guān)于每個(gè)話題的反饋。谷歌希望用戶幫助其更新這些頁(yè)面,包括添加用戶自己的反饋鏈接。

簡(jiǎn)介

本概覽及附帶的細(xì)節(jié)草案是《Go 2 設(shè)計(jì)草案》(Go 2 Draft Designs)文檔的一部分。Go 2 的總體目標(biāo)是為 Go 無(wú)法擴(kuò)展到大型代碼庫(kù)和大量開發(fā)人員這一問(wèn)題提供最重要的解決方式。

Go 編程無(wú)法成功擴(kuò)展的一大原因在于錯(cuò)誤檢查和錯(cuò)誤處理代碼的編寫?傮w來(lái)看,Go 編程代碼檢查錯(cuò)誤太多,但處理這些錯(cuò)誤的代碼卻非常不足(下文將給出解釋)。該設(shè)計(jì)草案旨在通過(guò)引入比當(dāng)前慣用的「賦值和 if 語(yǔ)句」(assignment-and-if-statement)組合更輕量級(jí)的錯(cuò)誤檢查語(yǔ)法來(lái)解決這個(gè)問(wèn)題。

作為 Go 2 的一部分,谷歌還考慮對(duì)錯(cuò)誤值的語(yǔ)義進(jìn)行更改,這是一個(gè)單獨(dú)的關(guān)注點(diǎn),但是本文檔僅涉及錯(cuò)誤檢查和處理。

在 Go 開源之前,Go 團(tuán)隊(duì)成員——尤其是 Ian Lance Taylor——就一直在研討「泛型」的可能設(shè)計(jì)(即參數(shù)多態(tài),parametric polymorphism)。谷歌從 C++ 和 Java 的經(jīng)驗(yàn)中得知,這一話題非常豐富、復(fù)雜,要想考慮透徹并設(shè)計(jì)出一個(gè)良好的解決方案將花費(fèi)很長(zhǎng)時(shí)間。谷歌一開始并沒(méi)有嘗試這一做法,而是將時(shí)間花在了更直接適用于 Go 網(wǎng)絡(luò)系統(tǒng)軟件(現(xiàn)在的「云軟件」)這一初始目標(biāo)的功能上,例如并發(fā)性、可擴(kuò)展構(gòu)建和低延遲垃圾收集。

Go 1 發(fā)布之后,谷歌繼續(xù)探索泛型的多種可能設(shè)計(jì)。2016 年 4 月,谷歌發(fā)布了這些早期設(shè)計(jì)(https://go.googlesource.com/proposal/+/master/design/15292-generics.md#)。作為 Go 2 再次進(jìn)入「設(shè)計(jì)模式」的一部分,Go 團(tuán)隊(duì)再次嘗試探索泛型的設(shè)計(jì),希望泛型能與 Go 語(yǔ)言融合,為用戶提供足夠的靈活性和表達(dá)性。

在 2016 和 2017 年的 Go 用戶調(diào)查中,某種形式的泛型是最迫切的兩個(gè)功能需求之一(另一個(gè)是包管理)。Go 社區(qū)維護(hù)一份「Go 泛型討論摘要」(Summary of Go Generics Discussions)文檔。

許多人錯(cuò)誤地以為 Go 團(tuán)隊(duì)的立場(chǎng)是「Go 永遠(yuǎn)不會(huì)有泛型」。但這并非事實(shí),谷歌知道泛型的潛力,它能讓 Go 更加靈活、強(qiáng)大、復(fù)雜。如果要增加泛型,谷歌想在盡量不增加 Go 復(fù)雜度的前提下努力提高其靈活度,并使其更加強(qiáng)大。

錯(cuò)誤處理:?jiǎn)栴}概覽

為了擴(kuò)展至大型代碼庫(kù),Go 程序必須是輕量級(jí)的,沒(méi)有不適當(dāng)?shù)闹貜?fù),且具備穩(wěn)健性,能夠優(yōu)雅地處理出現(xiàn)的錯(cuò)誤。

在 Go 的設(shè)計(jì)中,我們有意識(shí)地選擇使用顯性的錯(cuò)誤結(jié)果和錯(cuò)誤檢查。而 C 語(yǔ)言通常主要使用對(duì)隱性錯(cuò)誤結(jié)果的顯性檢查,而很多語(yǔ)言(包括 C++、C#、Java 和 Python)中都出現(xiàn)的異常處理表示對(duì)隱性結(jié)果的隱性檢查。

目標(biāo)

對(duì)于 Go 2,我們想使錯(cuò)誤檢查更加輕量級(jí),減少用于錯(cuò)誤檢查的 Go 程序文本量。我們還想更加方便地寫處理錯(cuò)誤的程序,提高編程人員處理錯(cuò)誤的可能性。

錯(cuò)誤檢查和錯(cuò)誤處理必須是顯性的,即在程序文本中可見。我們不想重復(fù)異常處理的缺陷。

現(xiàn)有代碼必須能夠繼續(xù)運(yùn)行,且和現(xiàn)在一樣有效。任何改變都必須能夠?qū)崿F(xiàn)對(duì)現(xiàn)有代碼的互操作。

如前所述,該設(shè)計(jì)的目標(biāo)不是改變或增強(qiáng)錯(cuò)誤的語(yǔ)義。

錯(cuò)誤值:?jiǎn)栴}概覽

大程序必須能夠以編程的方式測(cè)試錯(cuò)誤和作出反應(yīng),還要報(bào)告這些錯(cuò)誤。

由于錯(cuò)誤值是實(shí)現(xiàn) error 接口的任意值,Go 程序中有四種測(cè)試特定錯(cuò)誤的傳統(tǒng)方式。一,程序可以使用 sentinel error(如 io.EOF)測(cè)試它們的等價(jià)性。二,程序能夠使用 Type assertions 或 type switch 檢查錯(cuò)誤實(shí)現(xiàn)類型。三,點(diǎn)對(duì)點(diǎn)檢查(如 os.IsNotExist)檢查特定種類的錯(cuò)誤,進(jìn)行有限的解包。四,由于當(dāng)錯(cuò)誤被封裝進(jìn)額外的上下文中時(shí),這些方法通常都不奏效,因此程序通常在 err.Error() 報(bào)告的錯(cuò)誤文本中進(jìn)行子字符串搜索。很明顯,最后一種方法最不可取,即使是在出現(xiàn)任意封裝的情況下,支持前三種方法更好。

目標(biāo)

我們有兩個(gè)目標(biāo),分別對(duì)應(yīng)兩個(gè)主要問(wèn)題。一,我們想使檢查程序錯(cuò)誤的過(guò)程更加簡(jiǎn)單,出現(xiàn)的錯(cuò)誤更少,從而改善錯(cuò)誤處理和真實(shí)程序的穩(wěn)健性。二,我們想以標(biāo)準(zhǔn)格式打印出具備額外細(xì)節(jié)的錯(cuò)誤。

任何解決方案必須能夠使現(xiàn)有代碼正常運(yùn)行,且適合現(xiàn)有的源樹。尤其是,必須保留使用 error sentinel(如 io.ErrUnexpectedEOF)對(duì)比是否相等以及測(cè)試特定種類的錯(cuò)誤這些概念。必須繼續(xù)支持現(xiàn)有的 error sentinel,現(xiàn)有代碼不必改變成返回不同錯(cuò)誤類型。即擴(kuò)展函數(shù)(如 os.IsPermission)來(lái)理解任意封裝而不是固定集是可行的。

在考慮打印額外錯(cuò)誤細(xì)節(jié)的解決方案時(shí),我們偏好于使用 golang.org/x/text/message 使定位和翻譯錯(cuò)誤成為可能,或至少避免不可能。

包必須繼續(xù)輕松定義其錯(cuò)誤類型。定義新的通用「真實(shí)錯(cuò)誤實(shí)現(xiàn)」是不可接受的,且使用這種實(shí)現(xiàn)需要所有代碼。對(duì)錯(cuò)誤實(shí)現(xiàn)添加很多額外要求也是不可接受的,這些錯(cuò)誤實(shí)現(xiàn)只涉及到幾個(gè)包。錯(cuò)誤還必須能夠高效創(chuàng)建。錯(cuò)誤并非異常。在程序運(yùn)行期間,生成、處理、丟棄錯(cuò)誤都是很平常的事。

很多年前,谷歌一個(gè)用基于異常(exception-based)的語(yǔ)言寫的程序被發(fā)現(xiàn)一直生成異常。最后發(fā)現(xiàn),深層嵌套堆棧上的函數(shù)嘗試打開文件路徑固定列表中的每個(gè)路徑去尋找配置文件。每個(gè)失敗的打開操作就會(huì)導(dǎo)致一個(gè)異常;異常的生成浪費(fèi)了大量時(shí)間記錄這個(gè)深層執(zhí)行堆棧;之后調(diào)用器丟棄了所有這些工作,繼續(xù)進(jìn)行循環(huán)。在 Go 代碼中錯(cuò)誤的生成必須保持固定的開銷,不管堆棧深度或其他語(yǔ)境如何。(延遲的處理程序在堆棧解開之前運(yùn)行也是由于同樣的原因:關(guān)心堆棧上下文的處理程序能夠檢查活躍的堆棧,無(wú)需昂貴的 snapshot 操作。)

泛型:?jiǎn)栴}概覽

為了推廣 Go 語(yǔ)言的大型代碼庫(kù)和開發(fā)者的貢獻(xiàn),提高代碼的復(fù)用性就顯得非常重要。實(shí)際上,Go 語(yǔ)言早期的關(guān)注點(diǎn)只是確保能快速構(gòu)建包含很多獨(dú)立軟件包的程序,因此代碼的復(fù)用成本并不是很高。Go 語(yǔ)言的關(guān)鍵特征之一是它的接口方式,這種方式同樣也直接定位于提高代碼復(fù)用性。具體來(lái)說(shuō),這種接口可以寫一個(gè)算法的抽象實(shí)現(xiàn),從而消除不必要的細(xì)節(jié)。例如,container/heap 在 heap.Interface 操作上以普通函數(shù)的方式提供了堆維護(hù)(heap-maintenance)的算法,這使得 container/heap 適用于任何備用儲(chǔ)存,而不僅僅只是一些值。接口的這些屬性令 Go 非常強(qiáng)大。

與此同時(shí),大多數(shù)希望獲取優(yōu)先級(jí)序列的編程器并不希望為算法實(shí)現(xiàn)底層存儲(chǔ),然后再調(diào)用堆算法。這些編程器更愿意讓實(shí)現(xiàn)自行管理它的數(shù)組,但是 Go 不允許以 type-safe 的方式表達(dá)它。最接近的是創(chuàng)建 interface{} 值的優(yōu)先序列,并在獲取每一個(gè)元素后使用類型斷言。

多態(tài)變成不僅僅是數(shù)據(jù)容器。我們可能希望將許多通用算法實(shí)現(xiàn)為樸素的函數(shù),它們能應(yīng)用各種類型,但是我們現(xiàn)在在 Go 中寫的函數(shù)都只能應(yīng)用于單個(gè)類型。泛型函數(shù)的示例可能為如下:

目標(biāo)

谷歌的目標(biāo)是通過(guò)帶有類型參數(shù)的參數(shù)多態(tài)性來(lái)解決 Go 語(yǔ)言庫(kù)的編寫問(wèn)題,這些問(wèn)題抽象出了不必要的類型細(xì)節(jié)(如上所述)。

除了預(yù)料之中的容器類型外,谷歌還希望能編寫有用的庫(kù)來(lái)操作任意的 map 和 channel 值,理想的方案是編寫能在 []byte 和 string 值上運(yùn)算的多態(tài)函數(shù)。

允許其它類型的參數(shù)化并不是谷歌的目標(biāo),例如通過(guò)常數(shù)值進(jìn)行參數(shù)化等。此外允許多態(tài)定義的專有化實(shí)現(xiàn)也不是目標(biāo),例如使用比特包裝(bit-packing)定義一個(gè)通用的 vector 和特定的 vector

我們希望能從 C++和 Java 的泛型問(wèn)題中學(xué)習(xí)經(jīng)驗(yàn)。為了支持軟件工程,Go 語(yǔ)言的泛型必須明確記錄對(duì)類型參數(shù)的約束,以作為調(diào)用者和實(shí)現(xiàn)之間的明確強(qiáng)制協(xié)議。但調(diào)用者不滿足這些約束或?qū)崿F(xiàn)本身就超出了約束時(shí),編譯器報(bào)告明確的錯(cuò)誤也非常重要。

在沒(méi)有棘手的特殊情況和沒(méi)有暴露實(shí)現(xiàn)細(xì)節(jié)的前提下,Go 語(yǔ)言里的多態(tài)性必須平滑地適應(yīng)到環(huán)境語(yǔ)言中。例如,將類型參數(shù)限制到機(jī)器表征為單個(gè)指針或單個(gè)詞匯的情況中是不可接受的。還有另一個(gè)例子,一旦以上考慮的通用 Keys(map[K]V) []K 函數(shù)被初始化為 K=int 和 V=String,它必須和手寫的非泛型函數(shù)在語(yǔ)義上同等地處理。特別是,它必須可分配給類型變量 func(map[int]string) []int。

Go 語(yǔ)言中的多態(tài)性應(yīng)該要在編譯時(shí)和運(yùn)行時(shí)實(shí)現(xiàn),因此用于實(shí)現(xiàn)策略的決策還可以用于編譯器,并與其它任何編譯器優(yōu)化一視同仁。這種靈活性將解決泛型困境。Go 語(yǔ)言在很大程度上都是一種直觀且易于理解的語(yǔ)言,如果我們要添加多態(tài)性,就必須保留這一點(diǎn)。

參考內(nèi)容:

https://go.googlesource.com/proposal/+/master/design/go2draft.md

https://news.ycombinator.com/item?id=17859963

標(biāo)簽: Google isp 代碼 谷歌 開發(fā)者 搜索 推廣 網(wǎng)絡(luò) 云計(jì)算 云計(jì)算平臺(tái)

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:國(guó)外運(yùn)營(yíng)商被曝系統(tǒng)漏洞 可能泄露用戶數(shù)據(jù)

下一篇:數(shù)據(jù)科學(xué)如何幫助您刺探競(jìng)爭(zhēng)對(duì)手的行動(dòng)?