第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
慕課專欄

目錄

索引目錄

改善Go語言編程質(zhì)量的50個有效實踐

原價 ¥ 78.00

立即訂閱
01 Go 語言的前生今世
更新時間:2020-09-08 09:34:16
我要扼住命運的咽喉,它妄想使我屈服,這絕對辦不到。生活是這樣美好,活他一千輩子吧!——貝多芬

1. Go 語言的誕生

2007 年 9 月 20 日的下午,在谷歌山景城總部的一間辦公室里,谷歌的大佬級程序員 Rob Pike1在等待一個 C++ 項目構(gòu)建的過程中和谷歌的另外兩個大佬級程序員 Robert Griesemer2和 Ken Thompson3進行了一次有關(guān)設(shè)計一門新編程語言的討論4

圖片描述

圖1-1-1 Go語言之父(從左到右分別是Robert Griesemer、Rob Pike和Ken Thompson)

當(dāng)時的谷歌內(nèi)部主要使用 C++ 語言構(gòu)建各種系統(tǒng),但 C++ 的巨大復(fù)雜性、編譯構(gòu)建速度慢以及在編寫服務(wù)端程序時對并發(fā)支持的不便等讓三位大佬產(chǎn)生了重新設(shè)計一門新編程語言的想法。在他們的初步構(gòu)想中,這門新語言應(yīng)該是能夠給程序員帶來快樂、匹配未來硬件發(fā)展趨勢并適合用來開發(fā)谷歌內(nèi)部大規(guī)模程序的。

趁熱打鐵!在第一天的簡短討論后,第二天這三位大佬又在總部的一間名為 Yaounde 的會議室里進行了一場有關(guān)這門新語言具體設(shè)計的會議。會后的第二天,Robert Griesemer 發(fā)出了一封題為“prog lang discussion”的電郵,這封電郵便成為了這門新語言的第一版設(shè)計稿,三位大佬在這門語言的一些基礎(chǔ)語法特性上達(dá)成了初步一致。

9 月 25 日,Rob Pike 在一封回復(fù)電郵中把這門新編程語言命名為 Go:

    Subject: Re: prog lang discussion
    From: Rob 'Commander' Pike
    Date: Tue, Sep 25, 2007 at 3:12 PM
    To: Robert Griesemer, Ken Thompson

    i had a couple of thoughts on the drive home.

    1. name

    'go'. you can invent reasons for this name but it has nice properties.
    it's short, easy to type. tools: goc, gol, goa. if there's an interactive
    debugger/interpreter it could just be called 'go'. the suffix is .go
    ...

2. Go 語言的早期團隊和演化歷程

經(jīng)過早期討論,三位 Go 作者在語言設(shè)計上達(dá)成初步一致后,便開啟了 Go 語言迭代設(shè)計和實現(xiàn)的過程。

2008 年初,Unix 之父 Ken Thompson 實現(xiàn)了第一版 Go 編譯器,用于驗證之前的設(shè)計。這個編譯器先將 Go 代碼轉(zhuǎn)換為 C 代碼,再由 C 編譯器編譯成二進制文件。

到 2008 年中旬,Go 的第一版設(shè)計基本結(jié)束了。這時,同樣在谷歌工作的 Ian Lance Taylor 給 Go 語言的三位作者發(fā)了一封電子郵件。他宣稱為 Go 語言實現(xiàn)了一個 gcc 的前端,這也是 Go 語言的第二個編譯器。

    Subject: A gcc frontend for Go
    From: Ian Lance Taylor
    Date: Sat, Jun 7, 2008 at 7:06 PM
    To: Robert Griesemer, Rob Pike, Ken Thompson

    One of my office-mates pointed me at http://.../go_lang.html .  It
    seems like an interesting language, and I threw together a gcc
    frontend for it.  It's missing a lot of features, of course, but it
    does compile the prime sieve code on the web page.

隨后,Ian Lance Taylor 正式加入 Go 語言開發(fā)團隊,并在后面的 Go 語言發(fā)展演進進程中成為了 Go 語言及工具設(shè)計和實現(xiàn)的核心人物之一。Russ Cox 也是在 2008 年加入到剛成立不久的 Go 語言開發(fā)團隊的。隨著他的加入,他的一些天賦也隨即在語言設(shè)計和實現(xiàn)中展現(xiàn)出來,比如io.Readerio.Writer接口,奠定了所有 I/O 庫的整體結(jié)構(gòu)。

3. Go 語言正式公布并開源

2009 年 10 月 30 日,Rob Pike 在 Google Techtalk 上做了一次有關(guān) Go 語言的演講《The Go Programming Language》,這也是 Go 語言第一次公之于眾。

Go 語言項目在 2009 年 11 月 10 日正式開源,之后這一天被官方定位 Go 語言的誕辰。最初 Go 語言項目托管在 code.google.com 上,幾年后遷移至 GitHub。

隨著 Go 語言的開源,Go 語言吸引了全世界開發(fā)者的目光。再加上 Go 三位作者在業(yè)界的影響力以及谷歌這座大樹的加持,更多有才華的程序員加入到 Go 開發(fā)團隊中,更多貢獻(xiàn)者開始為 Go 語言項目添磚加瓦。于是,Go 在發(fā)布的當(dāng)年(2009 年)就成為了著名編程語言排行榜 TIOBE 的年度最佳編程語言。

Go 發(fā)布后就吸引了一些公司,尤其是云計算領(lǐng)域的初創(chuàng)公司成為了 Go 語言的早期接納者。在經(jīng)過若干年的磨合后,在這些公司中誕生了不乏像 Docker、Kubernetes 這樣的“殺手級”或示范性項目,這些項目也讓 Go 被譽為“云計算基礎(chǔ)設(shè)施新興語言”或直接稱為云計算語言。

在發(fā)布后,Go 語言也擁有了自己的“吉祥物” - 一只由 Rob Pike 夫人Renee French設(shè)計的地鼠,從此地鼠稱為了世界各地 Go 程序員的象征。Go 程序員也被稱為 Gopher,Go 語言官方技術(shù)大會也被稱為 GopherCon。

圖片描述

圖1-1-2 Go語言吉祥物

4. Go 語言的版本

和絕大多數(shù)編程語言相似,Go 語言也是“站在巨人的肩膀上的”,正如下圖所示,Go 繼承了諸多編程語言的特性。

圖片描述

圖1-1-3 Go的先祖

Go 的基本語法參考了 C 語言,是“C 家族語言”的一個分支;而 Go 的聲明語法、包概念則受到了 Pascal/Modula/Oberon 的啟發(fā);一些并發(fā)的思想則來自于受到了 Tony Hoare 教授 CSP 理論影響的語言,比如:Newsqueak 和 Limbo。

2009 年 11 月 10 日,Go 語言正式對外發(fā)布并開源。之后,Go 語言在一段時間內(nèi)采用了“Weekly Release”的模式,即每周發(fā)布一個版本。目前我們在 github.com 上 golang 的官方倉庫中仍能找到的早期的 Weekly Release 版本,比如:“weekly.2009-11-06”。

  • 從 2011 年 3 月 7 日開始,除了 Weekly Release,Go 項目還會每月發(fā)布一個 Release,即 Monthly Release,比如:release.r56,這種情況一直延續(xù)到 Go 1.0 版本發(fā)布之前;

  • 2012 年 3 月 28 日,Go 1.0 正式發(fā)布。同時 Go 官方發(fā)布 Go1 兼容性承諾:只要符合 Go1 語言規(guī)范的源代碼,Go 編譯器將保證向后兼容;

  • 2013 年 5 月 13 日,Go 1.1 版本發(fā)布。主要的變動點包括:

    • 新增"method value"語法:允許將方法綁定到一個特定的 receiver 實例上,從而形成一個 function;
    • 引入"terminating statement"的概念;
    • 將 64 位平臺上的 int 類型的字節(jié)數(shù)升為 8 個字節(jié),即 64 bits;
    • 更為精確的 Heap GC,尤其是針對 32 位平臺。
  • 2013 年 12 月 1 日,Go 1.2 版本發(fā)布。從 Go 1.2 開始,Go 開發(fā)組啟動了“以每 6 個月為一個發(fā)布周期”的發(fā)布計劃。Go 1.2 版本主要的變動點包括:

    • 增加 Full slice expression: a[low : high : max];
    • 實現(xiàn)搶占式 Goroutine 調(diào)度器;
    • go test 新增-cover 標(biāo)志用于計算測試覆蓋率。
  • 2014 年 6 月 18 日,Go 1.3 版本發(fā)布。主要的變動點包括:

    • 支持更多平臺:solaris,dragonfly,plan9,nacl 等;
    • goroutine 的 stack 模型從”segmented“ model 改為了“contiguous” model,改善“Hot stack split”問題;
    • 更為精確的 Stack GC。
  • 2014 年 12 月 10 日,Go 1.4 版本發(fā)布。Go 1.4 也是最后一個編譯器和 runtime 由 C 語言實現(xiàn)的版本。其主要的變動點包括:

    • 新增 for range x {…}形式的 for-range 語法;
    • 使用 Go 語言替換 runtime 的部分 C 語言實現(xiàn),這使得 GC 變得全面精確;
    • 由于 contiguous stack 的應(yīng)用,goroutine 的默認(rèn)棧大小從 8k 減小為 2k;
    • 增加 internal package 機制;
    • 增加"canonical import path"機制;
    • 新增 go generate 子命令;
    • 刪除 Go source 樹中的 src/pkg/xxx 中 pkg 這一級別,直接使用 src/xxx。
  • 2015 年 8 月 19 日,Go 1.5 版本發(fā)布,Go 1.5 版本是一個里程碑式的重要版本。因為從這個版本開始,Go 實現(xiàn)了自舉,即無需再依賴 C 編譯器。但 Go 編譯器的性能照比 Go 1.4 的 C 實現(xiàn)有了較大幅度的下降。其主要的變動點包括:

    • Go 編譯器和 runtime 使用 Go 全部重寫,原先的 C 實現(xiàn)被徹底移除;
    • 跨平臺編譯 Go 程序更為簡潔,只需設(shè)置兩個環(huán)境變量即可:GOARCH 和 GOOS;
    • 支持 map literal;
    • GOMAXPROCS 的初始默認(rèn)值由 1 改為了運行環(huán)境的 CPU 核數(shù);
    • 大幅度優(yōu)化 GC 延遲,多數(shù)情況 GC "Stop The World"的時間低于 10ms;
    • 增加 vendor 機制,改善 Go 包依賴管理;
    • 增加 go tool trace 子命令;
    • go build 增加-buildmode 命令選項,支持將 Go 代碼編譯為 shared library 形式。
  • 2016 年 2 月 17 日,Go 1.6 版本發(fā)布。主要的變動點包括:

    • 進一步優(yōu)化 GC 延遲,實現(xiàn) Go 程序在占用大內(nèi)存的情況下,GC 延遲仍低于 10ms;
    • 自動支持 HTTP/2;
    • 定義了在 C 代碼中共享 Go 指針的規(guī)則。
  • 2016 年 8 月 15 日,Go 1.7 版本發(fā)布。主要的變動點包括:

    • 針對 x86-64,實現(xiàn)了 SSA 后端,使得編譯出的 binary file size 減少 20%~30%;運行效率提升 5%~35%;
    • Go 編譯器的性能比 Go 1.6 版本提升近一倍;
    • go test 支持 subtests 和 sub-benchmarks;
    • 標(biāo)準(zhǔn)庫新增 context 包。
  • 2017 年 2 月 16 日,Go 1.8 版本發(fā)布。主要的變動點包括:

    • 支持僅 tags 不同的兩個 struct 可以相互做顯式類型轉(zhuǎn)換;
    • 標(biāo)準(zhǔn)庫增加 sort.Slice 函數(shù);
    • 支持 HTTP/2 Push 機制;
    • 支持支持 HTTP Server 優(yōu)雅退出;
    • 增加了對 Mutex 和 RWMutex 的 profiling(剖析)支持;
    • 支持 Go plugins,增加 plugin 包;
    • 支持默認(rèn)的 GOPATH 路徑,無需再顯式設(shè)置;
    • 進一步優(yōu)化 SSA 后端代碼,程序平均性能提升 10%左右;
    • Go 編譯器性能進一步提升,平均編譯鏈接的性能提升幅度在 15%左右;
    • GC 的延遲進一步降低,STW(Stop The World)的時間通常將低于 100 微秒,甚至經(jīng)常低于 10 微秒。
    • 優(yōu)化 defer 的實現(xiàn),使得其性能損耗降低了一半。
  • 2017 年 8 月 25 日,Go 1.9 版本發(fā)布。主要的變動點包括:

    • 新增了 type alias 語法;
    • 在原先的支持包級別的并發(fā)編譯的基礎(chǔ)上又實現(xiàn)了包函數(shù)級別的并發(fā)編譯,使得 Go 編譯性能有 10%左右的提升;
    • 大內(nèi)存對象分配性能得到顯著提升;
    • 增加了對 monotonic clock 的支持;
    • 提供了一個支持并發(fā)的 Map 類型:sync.Map;
    • 增加 math/bits 包,將高性能位操作實現(xiàn)收入標(biāo)準(zhǔn)庫。
  • 2018 年 2 月 17 日,Go 1.10 版本發(fā)布。主要的變動點包括:

    • 支持默認(rèn) GOROOT,開發(fā)者無需顯式設(shè)置 GOROOT 環(huán)境變量;
    • 增加 GOTMPDIR 環(huán)境變量;
    • 通過 cache 大幅提升構(gòu)建和 go test 執(zhí)行的性能,并基于源文件內(nèi)容是否變化判定是否使用 cache 結(jié)果;
    • 支持 Unicode 10.0 版本。
  • 2018 年 8 月 25 日,Go 1.11 版本發(fā)布。Go 1.11Russ CoxGopherCon 2017 大會上發(fā)表 之后的第一個 Go 版本,新的 Go 包管理機制 go modules 在 Go 1.11 中的落地為后續(xù)“Go2”的提議漸進落地奠定了良好的基礎(chǔ)。該版本主要的變動點包括:

    • 引入 Go module,為 Go 包管理提供了創(chuàng)新性的解決方案;
    • 引入對 WebAssembly 的支持,讓 Gopher 可以使用 Go 語言來開發(fā)前端 Web 應(yīng)用;
    • 為調(diào)試器增加了一個新的實驗功能:允許在調(diào)試過程中動態(tài)調(diào)用 Go 函數(shù)。
  • 2019 年 2 月 25 日,Go 1.12 版本發(fā)布。主要的變動點包括:

    • 對 Go 1.11 中增加的 go modules 機制做了進一步優(yōu)化;
    • 增加對 TLS 1.3 的支持;
    • 優(yōu)化了大量 heap 依然存在時 GC 清理環(huán)節(jié)的性能,使得一次 GC 后的內(nèi)存分配延遲得以改善;
    • 運行時更加積極地將釋放的內(nèi)存歸還給操作系統(tǒng),以應(yīng)對大塊內(nèi)存分配無法重用已存在的堆空間的問題;
    • 該版本中 Build cache 成為必需。
  • 2019 年 9 月 4 日,Go 1.13 版本發(fā)布。主要的變動點包括:

    • 增加以 0b 或 0B 開頭的二進制數(shù)字字面量形式,如:0b111;
    • 增加以"0o"或"0O"開頭的八進制數(shù)字字面量形式,如:0o700;
    • 增加以 0x 或 0X 開頭的十六進制形式的浮點數(shù)字面量,如:0x123.86p+2;
    • 支持在數(shù)字字面量中通過數(shù)字分隔符"_"提高可讀性,如:a := 5_3_7等;
    • 取消了移位操作(>><<)的右操作數(shù)僅能是無符號數(shù)的限制;
    • 繼續(xù)對 Go module 機制進行優(yōu)化,包括:當(dāng)GO111MODULE=auto時,無論是在$GOPATH/src 下還是 GOPATH 之外的倉庫中>,只要目錄下有 go.mod,Go 編譯器都會使用 go module 來管理依賴;GOPROXY 支持配置多個代理,默認(rèn)值為https://proxy.golang.org,direct;提供了 GOPRIVATE 變量,用于指示哪些倉庫下的 module 是私有的,即不需要通過 GOPROXY 下載,也不需要通過 GOSUMDB 去驗證其校驗和;
    • Go 錯誤處理改善:在標(biāo)準(zhǔn)庫中增加 errors.Is 和 As 函數(shù)來解決 error value 的比較判定問題;增加 errors.Unwrap 函數(shù)來解決 error 的展開(unwrap)問題;
    • defer 性能提升 30%;
    • 支持的 unicode 標(biāo)準(zhǔn)從 10.0 版本升級到Unicode 11.0 版本。
  • 2020 年 2 月 26 日,Go 1.14 版本發(fā)布。主要的變動點包括:

    • 支持嵌入接口的方法集可重疊;
    • 支持 goroutine 的異步搶占式調(diào)度;
    • defer 性能得到大幅優(yōu)化,理論上可實現(xiàn) 30%的提升;
    • 重新實現(xiàn)了運行時(runtime)層的 timer;
    • go module 可應(yīng)用于生產(chǎn)環(huán)境;
    • 標(biāo)準(zhǔn)庫 testing 包增加Cleanup方法用于實現(xiàn)測試執(zhí)行后的清理工作。

Go 團隊發(fā)布的 Go 語言穩(wěn)定版本總體質(zhì)量一直很高,少有影響使用的重大 bug。Go 團隊一直建議大家使用最新的發(fā)布版。Google 的產(chǎn)品,比如 Google App Engine(以下簡稱為 GAE),向來是這方面的“急先鋒” —— 一般在 Go 新版本發(fā)布不久后,GAE 便會宣布支持最新版本的 Go。

Go 團隊每年發(fā)布兩次大版本,一般是在二月份和八月份發(fā)布。Go 團隊對最新的兩個 Go 穩(wěn)定版本提供支持,比如如果目前最新版本是 Go 1.14,那么 Go 團隊會為 Go 1.14 和 Go 1.13 提供支持。如果 Go 1.15 版本發(fā)布,支持的版本將變成 Go 1.15 和 Go 1.14。支持的范圍主要包括修復(fù)版本中存在的重大問題、僅文檔變更以及安全問題更新。

5. 小結(jié)

了解一門編程語言的誕生歷史和早期演化史,有助于程序員在學(xué)習(xí)這門語言的同時產(chǎn)生或加深對語言的認(rèn)同感。程序員能感同身受,從而能更加有熱情的投入到這門語言的學(xué)習(xí)和使用當(dāng)中。同時這種認(rèn)同感也能積極推動程序員在后續(xù)的實踐中形成語言的原生思維(比如:Go 語言思維),從而更加高效地利用這門語言進行編程,解決實際問題。

同時,了解 Go 版本的發(fā)布?xì)v史以及不同版本的主要變動點,將有助于程序員根據(jù)自身的實際情況選擇最為適合的 Go 版本。


  1. Rob Pike(羅伯·派克),早期貝爾實驗室成員,參與了 Plan9 操作系統(tǒng)、C 編譯器以及多種語言編譯器的設(shè)計和實現(xiàn),UTF-8 發(fā)明人之一。 ??

  2. Robert Griesemer(羅伯特·格瑞史莫),Java 的 HotSpot 虛擬機和 Chrome 瀏覽器的 JavaScript V8 引擎的設(shè)計者之一。 ??

  3. Ken Thompson(肯·湯普遜),圖靈獎得主、Unix 之父以及 C 語言的發(fā)明人之一。 ??

  4. “少即是多” - https://commandcenter.blogspot.com/2012/06/less-is-exponentially-more.html ??

}
立即訂閱 ¥ 78.00

你正在閱讀課程試讀內(nèi)容,訂閱后解鎖課程全部內(nèi)容

千學(xué)不如一看,千看不如一練

手機
閱讀

掃一掃 手機閱讀

改善Go語言編程質(zhì)量的50個有效實踐
立即訂閱 ¥ 78.00

舉報

0/150
提交
取消