![]() ![]() |
Go程序設(shè)計(jì)語(yǔ)言(英文版) ![]()
Go語(yǔ)言是谷歌推出的一種全新的C語(yǔ)言風(fēng)格的編程語(yǔ)言,可以在不損失應(yīng)用程序性能的情況下降低代碼的復(fù)雜性,提高編程效率,適合開(kāi)發(fā)大型軟件,有望成為主流的編程語(yǔ)言。本書(shū)由《C程序設(shè)計(jì)語(yǔ)言》的作者Kernighan和谷歌公司Go團(tuán)隊(duì)合作編寫(xiě)而成,是關(guān)于Go語(yǔ)言編程的著作。
繼承K&R精髓的Go語(yǔ)言編程圣經(jīng),《C程序設(shè)計(jì)語(yǔ)言》的作者Kernighan教授與谷歌Go開(kāi)發(fā)團(tuán)隊(duì)核心成員Donovan聯(lián)合編寫(xiě)。
凝聚大師畢生造詣,融合Go開(kāi)發(fā)團(tuán)隊(duì)智慧,經(jīng)典與權(quán)*的碰撞,打造Go語(yǔ)言編程圣經(jīng)。 盡得《C程序設(shè)計(jì)語(yǔ)言》的精髓,簡(jiǎn)潔實(shí)用,字字珠璣,學(xué)習(xí)Go語(yǔ)言程序設(shè)計(jì)的權(quán)*指南。
“Go是一種開(kāi)放源代碼的程序設(shè)計(jì)語(yǔ)言,它意在使得人們能夠方便地構(gòu)建簡(jiǎn)單、可靠、高效的軟件。”(來(lái)自Go官網(wǎng)golang.org)Go形成構(gòu)想是在2007年9月,并于2009年11月發(fā)布,其發(fā)明人是Robert Griesemer、Rob Pike和Ken Thompson,這幾位都任職于Google。該語(yǔ)言及其配套工具集意在使得編譯和執(zhí)行都能夠富有表達(dá)力和效率,而且使得程序員能夠輕松寫(xiě)出可靠、健壯的程序。
Go和C從表面上看起來(lái)相似,而且和C一樣,它也是一種專(zhuān)業(yè)程序員使用的工具,兼有事半功倍之效。但是Go遠(yuǎn)不止是C的一種升級(jí)版本。它從多種其他語(yǔ)言中借用和改造了不少好的思想,還避開(kāi)了那些導(dǎo)致復(fù)雜和脆弱的語(yǔ)言特性。它為并發(fā)提供的設(shè)施是全新的、高效的,它實(shí)現(xiàn)數(shù)據(jù)抽象和面向?qū)ο蟮耐緩绞菢O其靈活的。它還提供了自動(dòng)化的內(nèi)存管理,或稱為垃圾收集。 Go特別適用于構(gòu)建基礎(chǔ)設(shè)施類(lèi)軟件(如網(wǎng)絡(luò)服務(wù)器),以及程序員使用的工具和系統(tǒng)等。但它的的確確是一種通用語(yǔ)言,而且在諸多領(lǐng)域(如圖像處理、移動(dòng)應(yīng)用和機(jī)器學(xué)習(xí))中都能發(fā)現(xiàn)它的身影。它在很多場(chǎng)合下被用于替換無(wú)類(lèi)型的腳本語(yǔ)言,這是由于它平衡了表達(dá)力和安全性:Go程序通常比動(dòng)態(tài)語(yǔ)言程序運(yùn)行速度要快,遭遇意料之外的類(lèi)型錯(cuò)誤而導(dǎo)致的崩潰更是少得多。 Go是個(gè)開(kāi)源項(xiàng)目,所以其編譯器、庫(kù)和工具的源代碼是所有人皆可免費(fèi)取得的。來(lái)自全世界的社區(qū)都在積極地向這個(gè)項(xiàng)目貢獻(xiàn)代碼。Go的運(yùn)行環(huán)境包括類(lèi)UNIX系統(tǒng)—Linux、FreeBSD、OpenBSD和Mac OS X,還有Plan 9和Microsoft Windows。只要在這些環(huán)境之一中寫(xiě)了一個(gè)程序,那么基本上不加修改就可以運(yùn)行在其他環(huán)境中。 本書(shū)旨在幫助你立刻開(kāi)始使用Go,以及良好地掌握這門(mén)語(yǔ)言,并充分地利用Go的語(yǔ)言特性和標(biāo)準(zhǔn)庫(kù)來(lái)撰寫(xiě)清晰的、符合習(xí)慣用法的、高效的程序。 Go的起源和生物學(xué)物種一樣,成功的語(yǔ)言會(huì)繁衍后代,這些后代語(yǔ)言會(huì)從它們的祖先那里汲取各種優(yōu)點(diǎn);有時(shí)候,語(yǔ)言間的混血會(huì)產(chǎn)生異常強(qiáng)大的力量;在一些罕見(jiàn)情況下,某個(gè)重大的語(yǔ)言特性也可能憑空出現(xiàn)而并無(wú)先例。通過(guò)考察語(yǔ)言間的影響,我們可以學(xué)得不少知識(shí),比如語(yǔ)言為什么會(huì)變成這個(gè)樣子,以及它適配過(guò)哪些環(huán)境,等等。 下圖展示了更早出現(xiàn)的程序設(shè)計(jì)語(yǔ)言對(duì)Go產(chǎn)生的最重要影響。 Go有時(shí)會(huì)被稱為“類(lèi)C語(yǔ)言”或“21世紀(jì)的C”。從C中,Go繼承了表達(dá)式語(yǔ)法、控制流語(yǔ)句、基本數(shù)據(jù)類(lèi)型、按值調(diào)用的形參傳遞、指針,但比這些更重要的是,繼承了C所強(qiáng)調(diào)的程序要編譯成高效的機(jī)器碼,并自然地與所處的操作系統(tǒng)提供的抽象機(jī)制相配合。 可是,Go的家譜中還有其他祖先。產(chǎn)生主要影響的是來(lái)自Niklaus Wirth設(shè)計(jì)的、以Pascal為發(fā)端的一個(gè)語(yǔ)言支流。Modula-2啟發(fā)了包概念。Oberon消除了模塊接口文件和模塊實(shí)現(xiàn)文件的區(qū)隔。Oberon-2影響了包、導(dǎo)入和聲明語(yǔ)法。Object Oberon則提供了方法聲明語(yǔ)法。 另一支Go的世系祖先,也是使得Go相對(duì)于當(dāng)下的程序設(shè)計(jì)顯得卓然不群者,是一族名不見(jiàn)經(jīng)傳的、在貝爾實(shí)驗(yàn)室開(kāi)發(fā)的研究用語(yǔ)言。這些語(yǔ)言都受到了Tony Hoare于1978年發(fā)表的關(guān)于并發(fā)性基礎(chǔ)的開(kāi)創(chuàng)性論文所提出的通信順序進(jìn)程(Communicating Sequential Process,CSP)的啟發(fā)。在CSP中,程序就是一組無(wú)共享狀態(tài)進(jìn)程的并行組合,進(jìn)程間的通信和同步采用信道完成。不過(guò),Hoare提出的CSP是一種形式語(yǔ)言,僅用以描述并發(fā)性的基本概念,并不是一種用來(lái)撰寫(xiě)可執(zhí)行程序的程序設(shè)計(jì)語(yǔ)言。 Rob Pike等人開(kāi)始動(dòng)手做一些實(shí)驗(yàn),嘗試把CSP實(shí)現(xiàn)為真正的語(yǔ)言。第一種這樣的語(yǔ)言稱為Squeak(“和鼠類(lèi)溝通的語(yǔ)言”),它是一種用以處理鼠標(biāo)和鍵盤(pán)事件的語(yǔ)言。緊接著它的是Newsqueak,它帶來(lái)的是類(lèi)C的語(yǔ)句和表達(dá)式語(yǔ)法,以及類(lèi)Pascal的類(lèi)型記法。它是一種純粹的函數(shù)式語(yǔ)言,帶有垃圾收集,同樣也以管理鍵盤(pán)、鼠標(biāo)和窗口事件為目標(biāo)。信道成了一等值(first-class value),它可以動(dòng)態(tài)創(chuàng)建并采用變量存儲(chǔ)。 Plan 9操作系統(tǒng)將這些思想都納入了一種稱為Alef的語(yǔ)言。Alef嘗試將Newsqueak改造成一種可用的系統(tǒng)級(jí)程序設(shè)計(jì)語(yǔ)言,但垃圾收集的缺失使得它在處理并發(fā)性時(shí)太過(guò)痛苦了。 Go中的其他結(jié)構(gòu)也會(huì)在這里或那里顯示出某些并非來(lái)自祖先的基因。例如,iota多多少少有點(diǎn)APL的影子,而嵌套函數(shù)的詞法作用域則來(lái)自Scheme(以及由之而來(lái)的大部分語(yǔ)言)。在Go語(yǔ)言中,也可以發(fā)現(xiàn)全新的變異。Go的創(chuàng)新性的切片為動(dòng)態(tài)數(shù)組提供了高效的隨機(jī)訪問(wèn)的同時(shí),也允許舊式鏈表的復(fù)雜共享機(jī)制。還有,defer語(yǔ)句也是Go中新引入的。 Go項(xiàng)目所有的程序設(shè)計(jì)語(yǔ)言都反映了其發(fā)明者的程序設(shè)計(jì)哲學(xué),這其中往往有相當(dāng)大的一部分是對(duì)于此前的語(yǔ)言已知缺點(diǎn)的應(yīng)對(duì)措施。Go這個(gè)項(xiàng)目也是誕生于挫敗感之中的,這種挫敗感來(lái)源于Google的若干遭遇了復(fù)雜性爆炸性增長(zhǎng)的軟件系統(tǒng)。(而這個(gè)問(wèn)題絕非Google所獨(dú)有的。)“復(fù)雜性是以乘積方式增長(zhǎng)的!盧ob Pike如是說(shuō)。為了修復(fù)某個(gè)問(wèn)題,一點(diǎn)點(diǎn)地將系統(tǒng)的某個(gè)部分變得更加復(fù)雜,這不可避免地也給其他部分增加了復(fù)雜性。在不斷要求增加系統(tǒng)功能和選項(xiàng)以及配置,還要快速發(fā)布的壓力之下,簡(jiǎn)單性往往被忽視了—盡管長(zhǎng)期來(lái)看,簡(jiǎn)單性才是好軟件的不二法門(mén)。 要實(shí)現(xiàn)簡(jiǎn)單性,就要求在項(xiàng)目的一開(kāi)始就將思想濃縮至本質(zhì),并在項(xiàng)目的整個(gè)生命期多保持一些自律,認(rèn)識(shí)到哪些變化是好的,哪些是壞的或致命的。只要投入足夠的努力,好的變化就既可以實(shí)現(xiàn)目的,又能夠不損害軟件設(shè)計(jì)上的Fred Brooks所謂的“概念完整性”。壞的變化就做不到這一點(diǎn),而致命的變化則會(huì)犧牲“簡(jiǎn)單性”而去換得其淺薄的兄弟概念—“方便性”。但是,只有通過(guò)設(shè)計(jì)上的簡(jiǎn)單性,系統(tǒng)才能在增長(zhǎng)過(guò)程中保持穩(wěn)定、安全和自洽。 Go項(xiàng)目不僅僅包括語(yǔ)言本身、它的工具和標(biāo)準(zhǔn)庫(kù),還有決不能忽視的一點(diǎn),就是它保持極端簡(jiǎn)單性的行為文化。在高級(jí)語(yǔ)言中,Go出現(xiàn)得較晚,因而有一定后發(fā)優(yōu)勢(shì),它的基礎(chǔ)部分實(shí)現(xiàn)得不錯(cuò):有垃圾收集、包系統(tǒng)、一等函數(shù)、詞法作用域、系統(tǒng)調(diào)用接口,還有不可變的、默認(rèn)用UTF-8編碼的字符串。但相對(duì)來(lái)說(shuō),它的語(yǔ)言特性不多,而且不太會(huì)增加新特性了。比如說(shuō),它沒(méi)有隱式數(shù)值類(lèi)型強(qiáng)制轉(zhuǎn)換,沒(méi)有構(gòu)造或析構(gòu)函數(shù),沒(méi)有運(yùn)算符重載,沒(méi)有形參默認(rèn)值,沒(méi)有繼承,沒(méi)有泛型,沒(méi)有異常,沒(méi)有宏,沒(méi)有函數(shù)注記,沒(méi)有線程局部存儲(chǔ)。這門(mén)語(yǔ)言成熟而穩(wěn)定,并且保證兼容更早版本:在舊版本的Go語(yǔ)言中寫(xiě)的程序,可以在新版本的編譯器和標(biāo)準(zhǔn)庫(kù)下編譯和運(yùn)行。 Go的類(lèi)型系統(tǒng)足可以使程序員避免在動(dòng)態(tài)語(yǔ)言中會(huì)無(wú)意犯下的絕大多數(shù)錯(cuò)誤,但相對(duì)而言,它在帶類(lèi)型的語(yǔ)言中又算是類(lèi)型系統(tǒng)比較簡(jiǎn)單的。其實(shí)現(xiàn)手法有時(shí)候會(huì)導(dǎo)致類(lèi)型框架林立卻彼此孤立的“無(wú)類(lèi)型”程序設(shè)計(jì)風(fēng)格,并且Go程序員不會(huì)在類(lèi)型方面走到C++或Haskell程序員的那一步—重度地表達(dá)類(lèi)型安全性作為語(yǔ)言具備類(lèi)型基礎(chǔ)的證據(jù)。但在實(shí)際工作中,Go卻能為程序員提供具備相當(dāng)強(qiáng)類(lèi)型的系統(tǒng)才能實(shí)現(xiàn)的安全性和運(yùn)行時(shí)性能,而不讓程序員承擔(dān)這種系統(tǒng)的復(fù)雜性。 Go提倡充分利用當(dāng)代計(jì)算機(jī)系統(tǒng)設(shè)計(jì),尤其強(qiáng)調(diào)局部性的重要。其內(nèi)建數(shù)據(jù)類(lèi)型和大多數(shù)庫(kù)數(shù)據(jù)結(jié)構(gòu)都經(jīng)過(guò)仔細(xì)設(shè)計(jì),力求以自然方式工作,而不要求顯式的初始化或隱式的構(gòu)造函數(shù)。這么一來(lái),隱藏在代碼中的內(nèi)存分配和內(nèi)存寫(xiě)入就大大減少了。Go中的聚合類(lèi)型(結(jié)構(gòu)體和數(shù)組)都是以直接方式持有其元素,需要更少的存儲(chǔ)以及比使用間接域的語(yǔ)言還少的分配動(dòng)作和間接指針。由于現(xiàn)代計(jì)算機(jī)都是并行工作的,正如前面提到的那樣,Go有著基于CSP的并行特性。Go還提供了變長(zhǎng)棧來(lái)運(yùn)行其輕量級(jí)線程,或稱為goroutine。這個(gè)棧初始化時(shí)非常小,所以創(chuàng)建一個(gè)goroutine的成本極低,創(chuàng)建100萬(wàn)個(gè)也完全可以接受。 Go標(biāo)準(zhǔn)庫(kù)常常被稱作“語(yǔ)言自帶電池”,它提供了清晰的構(gòu)件,以及用于I/O、文本處理、圖像、加解密、網(wǎng)絡(luò)、分布式應(yīng)用的API,而且對(duì)許多標(biāo)準(zhǔn)文件格式和協(xié)議都提供了支持。Go的庫(kù)和工具充分地尊重慣例,減少了配置和解釋的需要,從而簡(jiǎn)化了程序邏輯,提高了多種多樣的Go程序之間的相似性,使得它更容易學(xué)習(xí)和掌握。采用go工具構(gòu)建的項(xiàng)目,僅使用文件和標(biāo)識(shí)符的名字(在極少情況下使用特殊注釋?zhuān),就可以推斷出一個(gè)項(xiàng)目使用的所有庫(kù)、可執(zhí)行文件、測(cè)試、性能基準(zhǔn)、示例、平臺(tái)相關(guān)變體,以及文檔。Go的源代碼中就包含了構(gòu)建的規(guī)格說(shuō)明。 全書(shū)組織我們假定你用過(guò)一兩種其他語(yǔ)言編過(guò)程序,可能是像C、C++或Java那樣的編譯型語(yǔ)言,也可能是像Python、Ruby或JavaScript那樣的解釋型語(yǔ)言,所以我們不會(huì)像對(duì)一個(gè)沒(méi)有任何基礎(chǔ)的初學(xué)者那樣事無(wú)巨細(xì)地講述所有事。表面上的語(yǔ)法大體雷同,變量、常量、表達(dá)式、控制流和函數(shù)也一樣。 第1章是Go的基礎(chǔ)結(jié)構(gòu)的綜述,通過(guò)十幾個(gè)完成日常任務(wù)(包括讀寫(xiě)文件、格式化文本、創(chuàng)建圖像,以及在Internet客戶端和服務(wù)器之間通信)的程序來(lái)介紹這門(mén)語(yǔ)言。 第2章講述Go程序的組成元素—聲明、變量、新類(lèi)型、包和文件,以及作用域。第3章討論數(shù)值、布爾量、字符串、常量,還解釋如何處理Unicode。第4章描述組合類(lèi)型,即使用簡(jiǎn)單類(lèi)型構(gòu)造的類(lèi)型,形式有數(shù)組、鍵值對(duì)、結(jié)構(gòu)體,還有切片這種Go中動(dòng)態(tài)表的實(shí)現(xiàn)。第5章的內(nèi)容是函數(shù),另外還討論了錯(cuò)誤處理、崩潰和恢復(fù),以及defer語(yǔ)句。 可以看出,第1章到第5章是基礎(chǔ)性的,其內(nèi)容是任何命令式語(yǔ)言都有的。Go的語(yǔ)法和風(fēng)格可能與其他語(yǔ)言有所不同,但大多數(shù)程序員都能很快掌握。余下的章節(jié)所關(guān)注的則是Go語(yǔ)言中與慣常做法有一定區(qū)別的內(nèi)容,包括方法、接口、并發(fā)、包、測(cè)試和反射。 Go以一種不同尋常的方式來(lái)詮釋面向?qū)ο蟪绦蛟O(shè)計(jì)。它沒(méi)有類(lèi)繼承,甚至沒(méi)有類(lèi)。較復(fù)雜的對(duì)象行為是通過(guò)較簡(jiǎn)單的對(duì)象組合而非繼承完成的。方法可以關(guān)聯(lián)到任何用戶自定義的類(lèi)型,而不一定是結(jié)構(gòu)體。具體類(lèi)型和抽象類(lèi)型(即接口)之間的關(guān)系是隱式的,所以一個(gè)具體類(lèi)型可能會(huì)滿足該類(lèi)型設(shè)計(jì)者沒(méi)有意識(shí)到其存在的接口。方法在第6章講述,接口在第7章講述。 第8章內(nèi)容是Go的并發(fā)性處理途徑,它基于CSP思想,采用goroutine和信道實(shí)現(xiàn)。第9章則討論并發(fā)性中較傳統(tǒng)的基于共享變量的一些方面的話題。 第10章討論包,也就是組織庫(kù)的機(jī)制。本章也說(shuō)明如何高效地利用go工具,僅僅這個(gè)工具,就提供了編譯、測(cè)試、性能基準(zhǔn)測(cè)定、程序格式化、文檔,以及完成許多其他任務(wù)的功能。 第11章討論測(cè)試,在這里Go采取了顯著的輕量級(jí)途徑,避免了重重抽象的框架,轉(zhuǎn)而使用簡(jiǎn)單的庫(kù)和工具。測(cè)試庫(kù)提供了一個(gè)基礎(chǔ),在其之上如有必要就可以構(gòu)建更復(fù)雜的抽象了。 第12章討論反射,即程序在執(zhí)行期間考察自身表示的能力。反射是一種強(qiáng)大的工具,不過(guò)得小心使用它,本章通過(guò)演示如何用它來(lái)實(shí)現(xiàn)某些重要的Go庫(kù),解釋了如何找到適當(dāng)?shù)钠胶。?3章解釋低階程序設(shè)計(jì)的細(xì)節(jié),運(yùn)用unsafe包來(lái)繞過(guò)Go的類(lèi)型系統(tǒng),以及什么時(shí)候這樣做是合適的。 每章都配以一定數(shù)量的練習(xí),你可以用來(lái)測(cè)試對(duì)Go的理解,或是探索對(duì)書(shū)中示例的擴(kuò)展和變形。 除了最簡(jiǎn)單的那些以外,所有書(shū)中的示例代碼都可以從位于gopl.io的公開(kāi)Git倉(cāng)庫(kù)下載。每個(gè)示例由其包的導(dǎo)入路徑識(shí)別,從而能夠方便地使用go get命令獲取、構(gòu)建和安裝。你需要選取一個(gè)目錄作為你的Go工作空間,并將GOPATH環(huán)境變量指向之。在必要時(shí),go工具會(huì)創(chuàng)建該目錄。例如: 欲運(yùn)行這些例子,你至少需要使用1.5版本的Go語(yǔ)言。 如果你的計(jì)算機(jī)上的go工具太舊或是缺失,請(qǐng)按https://golang.org/doc/install的指令操作。 更多信息來(lái)源關(guān)于Go的更多信息,最好的來(lái)源就是Go的官方網(wǎng)站:https://golang.org,它上面列出了文檔供讀者訪問(wèn),包括Go程序設(shè)計(jì)語(yǔ)言規(guī)范、標(biāo)準(zhǔn)包,諸如此類(lèi)。它上面還列出語(yǔ)言綜述,指導(dǎo)如何撰寫(xiě)Go程序,以及如何撰寫(xiě)好的Go程序,還有范圍廣泛的在線文本和視頻資源,這些都是對(duì)本書(shū)的有價(jià)值的補(bǔ)充。位于blog.golang.org的Go博客發(fā)表的是關(guān)于Go的最好文章,以及該語(yǔ)言當(dāng)下?tīng)顟B(tài)、未來(lái)計(jì)劃、會(huì)議報(bào)告,還有范圍廣泛的Go相關(guān)話題的深度解讀。 Go官網(wǎng)在線訪問(wèn)的一個(gè)最有用的方面(這也是紙質(zhì)書(shū)的一個(gè)令人遺憾的限制),就是它提供了從描述Go程序的網(wǎng)頁(yè)上直接運(yùn)行Go程序的能力。這種功能由位于play.golang.org的Go訓(xùn)練場(chǎng)提供,也有嵌入其他頁(yè)面的,比如位于golang.org的首頁(yè),或是由godoc工具提供的文檔頁(yè)面。 訓(xùn)練場(chǎng)為執(zhí)行簡(jiǎn)單的實(shí)驗(yàn),撰寫(xiě)短小的程序來(lái)檢驗(yàn)自己對(duì)語(yǔ)法、語(yǔ)義和庫(kù)包的理解提供了方便,它在很多方面取代了其他語(yǔ)言中的讀取–求值–輸出循環(huán)(Read-Eval-Print Loop,REPL)。它的永久URL對(duì)于共享使用Go寫(xiě)成的小段代碼、報(bào)告缺陷或提出建議都是很有用的。 在訓(xùn)練場(chǎng)的基礎(chǔ)之上,位于tour.golang.org的Go綜述就是一系列的小型交互式課程,內(nèi)容是Go語(yǔ)言的基礎(chǔ)思想和結(jié)構(gòu),是整門(mén)語(yǔ)言的有序攻略。 訓(xùn)練場(chǎng)和綜述的主要缺點(diǎn)在于它只允許導(dǎo)入標(biāo)準(zhǔn)庫(kù),還有很多庫(kù)特性(比如網(wǎng)絡(luò)庫(kù))都出于可操作性或安全原因加以限制了。而要編譯和運(yùn)行每個(gè)程序,都要求Internet連接。所以,欲進(jìn)行更詳盡的實(shí)驗(yàn),需要在本機(jī)上運(yùn)行Go程序。幸運(yùn)的是,下載過(guò)程相當(dāng)直截了當(dāng),從golang.org獲取Go的分發(fā)程序并開(kāi)始撰寫(xiě)和運(yùn)行你自己的Go程序,用不了幾分鐘。 由于Go是個(gè)開(kāi)源項(xiàng)目,你可以從https://golang.org/pkg上在線讀取標(biāo)準(zhǔn)庫(kù)中的任何類(lèi)型或函數(shù)的代碼,每個(gè)供下載的分發(fā)都同樣包含這些代碼。請(qǐng)使用這些代碼來(lái)弄明白某些程序的運(yùn)行原理、回答關(guān)于程序細(xì)節(jié)的問(wèn)題,也可以用它們來(lái)學(xué)一學(xué)專(zhuān)家是如何寫(xiě)出一流的Go代碼的。 致謝來(lái)自Go團(tuán)隊(duì)的核心成員Rob Pike和Russ Cox仔細(xì)通讀了初稿數(shù)次,他們對(duì)于從詞句的斟酌到整體結(jié)構(gòu)和組織的建議都極富價(jià)值。在準(zhǔn)備本書(shū)的日語(yǔ)版時(shí),柴田芳樹(shù)所做的貢獻(xiàn)大大超過(guò)了他負(fù)擔(dān)的義務(wù),他的火眼金睛發(fā)現(xiàn)了大量英語(yǔ)文本中的不一致性,以及代碼中的錯(cuò)誤。我們向Brian Goetz、Corey Kosak、Arnold Robbins、Josh Bleecher Snyder以及Peter Weinberger對(duì)全書(shū)初稿所進(jìn)行的徹底審查和批評(píng)建議深表敬意。 我們感激Sameer Ajmani、Ittai Balaban、David Crawshaw、Billy Donohue、Jonathan Feinberg、Andrew Gerrand、Robert Griesemer、John Linderman、Minux Ma、Bryan Mills、Bala Natarajan、Cosmos Nicolaou、Paul Staniforth、Nigel Tao以及Howard Trickey提供的諸多有用建議。 我們也感謝David Brailsford和Raph Levien的排版建議。 我們的Addison-Wesley編輯Greg Doench最初催生了本書(shū),而且一直不斷地給予幫助。Addison-Wesley的制作團(tuán)隊(duì)—John Fuller、Dayna Isley、Julie Nahil、Chuti Prasertsith以及Barbara Wood—非常杰出,作者得到了一流的支持。 Alan Donovan想要感謝Google的Sameer Ajmani、Chris Demetriou、Walt Drummond以及Reid Tatge讓他有時(shí)間來(lái)寫(xiě)作這本書(shū),還有Stephen Donovan的建議和及時(shí)的鼓勵(lì)。最重要的是他的妻子Leila Kazemi,她為寫(xiě)作項(xiàng)目提供了毫不猶豫的熱情和毫不動(dòng)搖的支持,即使寫(xiě)作造成了很多家庭生活的分心和缺席。 Brian Kernighan對(duì)他的朋友和同事深表謝意,他們對(duì)Kernighan花費(fèi)了很長(zhǎng)時(shí)間才達(dá)成對(duì)語(yǔ)言的理解表示了耐心和理解。尤其是他的妻子Meg,她為Kernighan的寫(xiě)作以及太多的其他事務(wù)提供了不間斷的支持。 紐約2015年10月 查看全部↓
第1章 綜述 1
1.1 Hello,World 1 1.2 命令行參數(shù) 4 1.3 查找重復(fù)行 8 1.4 GIF動(dòng)畫(huà) 13 1.5 獲取一個(gè)URL 15 1.6 并發(fā)獲取多個(gè)URL 17 1.7 實(shí)現(xiàn)一個(gè)Web服務(wù)器 19 1.8 雜項(xiàng) 23 第2章 程序結(jié)構(gòu) 27 2.1 名字 27 2.2 聲明 28 2.3 變量 30 2.4 賦值 36 2.5 類(lèi)型聲明 39 2.6 包和文件 41 2.7 作用域 45 第3章 基本數(shù)據(jù)類(lèi)型 51 3.1 整數(shù) 51 3.2 浮點(diǎn)數(shù) 56 3.3 復(fù)數(shù) 61 3.4 布爾量 63 3.5 字符串 64 3.6 常量 75 第4章 復(fù)合類(lèi)型 81 4.1 數(shù)組 81 4.2 切片 84 4.3 鍵值對(duì) 93 4.4 結(jié)構(gòu)體 99 4.5 JSON 107 4.6 文本和HTML模板 113 第5章 函數(shù) 119 5.1 函數(shù)聲明 119 5.2 遞歸 121 5.3 多返回值 124 5.4 錯(cuò)誤 127 5.5 作為值的函數(shù) 132 5.6 匿名函數(shù) 135 5.7 變參函數(shù) 142 5.8 延后函數(shù)調(diào)用 143 5.9 崩潰 148 5.10 恢復(fù) 151 第6章 方法 155 6.1 方法聲明 155 6.2 帶有指針接收器的方法 158 6.3 包含嵌入結(jié)構(gòu)體的復(fù)合類(lèi)型 161 6.4 作為值和表達(dá)式的方法 164 6.5 示例:位向量類(lèi)型 165 6.6 封裝 168 第7章 接口 171 7.1 作為規(guī)約的接口 171 7.2 接口類(lèi)型 174 7.3 接口約定的達(dá)成 175 7.4 使用flag.Value進(jìn)行標(biāo)志位分析 179 7.5 作為值的接口 181 7.6 使用sort.Interface進(jìn)行排序 186 7.7 http.Handler接口 191 7.8 錯(cuò)誤接口 196 7.9 示例:表達(dá)式評(píng)估器 197 7.10 類(lèi)型斷言 205 7.11 使用類(lèi)型斷言分辨錯(cuò)誤 206 7.12 使用接口類(lèi)型斷言查詢行為 208 7.13 按類(lèi)型的程序分支 210 7.14 示例:基于標(biāo)記符號(hào)的XML解碼 213 7.15 幾句建議 216 第8章 goroutine和信道 217 8.1 goroutine 217 8.2 示例:并發(fā)時(shí)鐘服務(wù)器 219 8.3 示例:并發(fā)回聲服務(wù)器 222 8.4 信道 225 8.5 并行循環(huán) 234 8.6 示例:并發(fā)Web爬蟲(chóng) 239 8.7 使用select實(shí)現(xiàn)多工 244 8.8 示例:并發(fā)目錄遍歷 247 8.9 取消執(zhí)行 251 8.10 示例:聊天服務(wù)器 253 第9章 使用共享變量實(shí)現(xiàn)并發(fā) 257 9.1 競(jìng)險(xiǎn) 257 9.2 互斥量:sync.Mutex 262 9.3 讀寫(xiě)互斥量:sync.RWMutex 266 9.4 內(nèi)存同步 267 9.5 緩式初始化:sync.Once 268 9.6 競(jìng)險(xiǎn)檢測(cè)器 271 9.7 示例:并發(fā)無(wú)阻塞式高速緩存 272 9.8 goroutine和線程 280 第10章 包和go工具 283 10.1 概述 283 10.2 導(dǎo)入路徑 284 10.3 包聲明 285 10.4 導(dǎo)入聲明 285 10.5 空導(dǎo)入 286 10.6 包和命名 289 10.7 go工具 290 第11章 測(cè)試 301 11.1 go test工具 302 11.2 測(cè)試函數(shù) 302 11.3 覆蓋率 318 11.4 性能基準(zhǔn)函數(shù) 321 11.5 性能剖析 323 11.6 示例函數(shù) 326 第12章 反射 329 12.1 為什么會(huì)引入反射概念 329 12.2 reflect.Type和reflect.Value 330 12.3 遞歸值輸出Display 333 12.4 示例:對(duì)S-表達(dá)式編碼 338 12.5 使用reflect.Value給變量設(shè)置值 341 12.6 示例:對(duì)S-表達(dá)式解碼 344 12.7 訪問(wèn)結(jié)構(gòu)體域標(biāo)簽 348 12.8 列出類(lèi)型的方法 351 12.9 幾句忠告 352 第13章 低階程序設(shè)計(jì) 353 13.1 unsafe.Sizeof、Alignof和Offsetof 354 13.2 unsafe.Pointer 356 13.3 示例:深等價(jià) 358 13.4 使用cgo調(diào)用C代碼 361 13.5 再來(lái)幾句忠告 366 1. Tutoria 1 1.1. Hello, World1 1.2.?Command?L?ineArguments?4 1.3.?FindingDup?lic?ateLines?8 1.4.?Animated?GIFs?13 1.5.?FetchingaURL?15 1.6.?FetchingURLs?Con?cur?rently17 1.7.?AWe?bServer?19 1.8.?Loose?End?s232.? 2.?ProgramStr?ucture27 2.1.?Names?27 2.2.?Declarat?ions?28 2.3.?Var?iables?30 2.4.?Assig?nments?36 2.5.?Typ?eDecl?arat?ions?39 2.6.?Packages?andFiles?41 2.7.?Scope?45 3.?Basic?Data?Typ?es51 3.1.?Int?egers?51 3.2.?Float?ing?Point?Numbers?56 3.3.?Complex?Numbers?61 3.4.?Boole?ans63 3.5.?Str?ings64 3.6.?Con?stants75 4.?Com?positeTyp?es81 4.1.?Arrays?81 4.2.?Slices?84 4.3.?Maps?93 4.4.?Str?ucts99 4.5.?JSON107 4.6.?Text?andHTMLTempl?ates113 5.?Func?tions?119 5.1.?FunctionDeclarat?ions?119 5.2.?Rec?ursio 121 5.3..MultipleReturn Values.124 5.4..Errors 127 5.5..FunctionValues.132 5.6..Anonymous Functions.135 5.7..Variadic.Functions.142 5.8..Deferred.FunctionCalls 143 5.9..Panic.148 5.10..Recover 151 6..Methods 155 6.1..Method.Declarations.155 6.2..MethodswithaPointerReceiver 158 6.3..ComposingTypesby.Struct.Embedding 161 6.4..Method.Values.andExpressions.164 6.5..Example:.Bit.Vector.Type 165 6.6..Encapsulation 168 7..Interfaces 171 7.1..Interfaces.as.Contracts 171 7.2..Interface.Types 174 7.3..Interface.Satisfaction 175 7.4..ParsingFlags.withflag.Value 179 7.5..Interface.Values.181 7.6..Sortingwithsort.Interface 186 7.7..The http.Handler Interface.191 7.8..The error Interface.196 7.9..Example:.ExpressionEvaluator 197 7.10..Type Assertions.205 7.11..DiscriminatingErrorswith.TypeAssertions.206 7.12..QueryingBehaviorswith.Interface.TypeAssertions.208 7.13..Type Switches 210 7.14..Example:.Token-Based.XML.Decoding 213 7.15..AFew Words.ofAdvice.216 8..Goroutines.and.Channels.217 8.1..Goroutines 217 8.2..Example:.ConcurrentClockServer.219 8.3..Example:.ConcurrentEcho Server.222 8.4..Channels 225 8.5..Looping.inParallel 234 8.6..Example:.ConcurrentWeb.Crawler 239 8.7..Multiplexingwithselect 244 8.8..Example:.ConcurrentDirectoryTraversal 247 8.9..Cancellation 251 8.10..Example:.ChatSer.ver.253 9..Concurrency.withShared.Vari.ables 257 9.1..Race.Con.dit.ion.s 257 9.2..Mut.ual.Exc.lusion:sync.Mutex 262 9.3..Read/Write.Mut.exes:sync.RWMutex 266 9.4..Memor.ySy.nchro.nizat.ion 267 9.5..Lazy.Initializat.ion:sync.Once 268 9.6..TheRace.Detec.tor.271 9.7..Example:.Con.cur.rentNon-Blo.cking.Cache.272 9.8..Goroutinesand.Threads.280 10..Pack.ages and.the.GoTool 283 10.1..Int.roduc.tion 283 10.2..Imp.ort.Pat.hs 284 10.3..ThePackageDeclarat.ion 285 10.4..Imp.ort.Declarat.ions.285 10.5..Blank.Imp.orts 286 10.6..Packages.andNaming 289 10.7..TheGoTool 290 11..Testing.301 11.1..The go.test To.ol 302 11.2. Test Func.tions.302 11.3..Cov.erage 318 11.4. Benchmark Func.tions.321 11.5..Pro.ling 323 11.6. Example Func.tions.326 12..Re.ecti.on 329 12.1..Why.Re.ec.tion? 329 12.2. reflect.Type and reflect.Value 330 12.3. Display,aRec.ursiveValue.Print.er 333 12.4..Example:.Enco.dingS-E.xpressions.338 12.5..Setting.Var.iables.wit.hreflect.Value 341 12.6..Example:.DecodingS-E.xpressions.344 12.7..AccessingStr.uct.Field.Tags.348 12.8..Displaying.the.Met.hodsofaTyp.e 351 12.9..AWo.rdofCaution.352 13..Low-L.evel.Pro.gramming 353 13.1. unsafe.Sizeof, Alignof,and Offsetof 354 13.2. unsafe.Pointer 356 13.3..Example:.DeepEquivalence.358 13.4..Cal.lingCCodewit.hcgo 361 13.5..Another.WordofCaution.366 查看全部↓
你還可能感興趣
我要評(píng)論
|