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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
慕課專欄

目錄

索引目錄

改善Go語(yǔ)言編程質(zhì)量的50個(gè)有效實(shí)踐

原價(jià) ¥ 78.00

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

1. Go 語(yǔ)言的誕生

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

圖片描述

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

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

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

9 月 25 日,Rob Pike 在一封回復(fù)電郵中把這門(mén)新編程語(yǔ)言命名為 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 語(yǔ)言的早期團(tuán)隊(duì)和演化歷程

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

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

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

    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 語(yǔ)言開(kāi)發(fā)團(tuán)隊(duì),并在后面的 Go 語(yǔ)言發(fā)展演進(jìn)進(jìn)程中成為了 Go 語(yǔ)言及工具設(shè)計(jì)和實(shí)現(xiàn)的核心人物之一。Russ Cox 也是在 2008 年加入到剛成立不久的 Go 語(yǔ)言開(kāi)發(fā)團(tuán)隊(duì)的。隨著他的加入,他的一些天賦也隨即在語(yǔ)言設(shè)計(jì)和實(shí)現(xiàn)中展現(xiàn)出來(lái),比如io.Readerio.Writer接口,奠定了所有 I/O 庫(kù)的整體結(jié)構(gòu)。

3. Go 語(yǔ)言正式公布并開(kāi)源

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

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

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

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

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

圖片描述

圖1-1-2 Go語(yǔ)言吉祥物

4. Go 語(yǔ)言的版本

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

圖片描述

圖1-1-3 Go的先祖

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    • 支持默認(rèn) GOROOT,開(kāi)發(fā)者無(wú)需顯式設(shè)置 GOROOT 環(huán)境變量;
    • 增加 GOTMPDIR 環(huán)境變量;
    • 通過(guò) 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 大會(huì)上發(fā)表 之后的第一個(gè) Go 版本,新的 Go 包管理機(jī)制 go modules 在 Go 1.11 中的落地為后續(xù)“Go2”的提議漸進(jìn)落地奠定了良好的基礎(chǔ)。該版本主要的變動(dòng)點(diǎn)包括:

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

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

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

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

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

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

5. 小結(jié)

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

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


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

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

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

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

}
立即訂閱 ¥ 78.00

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

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

手機(jī)
閱讀

掃一掃 手機(jī)閱讀

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

舉報(bào)

0/150
提交
取消