編輯推薦
繼承K&R;精髓的Go語言編程聖經,《C程序設計語言》的作者Kernighan教授與榖歌Go開發團隊核心成員Donovan聯閤編寫。
凝聚大師畢生造詣,融閤Go開發團隊智慧,經典與權*的碰撞,打造Go語言編程聖經。
盡得《C程序設計語言》的精髓,簡潔實用,字字珠璣,學習Go語言程序設計的權*指南。
內容簡介
Go語言是榖歌推齣的一種全新的C語言風格的編程語言,可以在不損失應用程序性能的情況下降低代碼的復雜性,提高編程效率,適閤開發大型軟件,有望成為主流的編程語言。本書由《C程序設計語言》的作者Kernighan和榖歌公司Go團隊閤作編寫而成,是關於Go語言編程的著作。
目錄
第1章 綜述 1
1.1 Hello,World 1
1.2 命令行參數 4
1.3 查找重復行 8
1.4 GIF動畫 13
1.5 獲取一個URL 15
1.6 並發獲取多個URL 17
1.7 實現一個Web服務器 19
1.8 雜項 23
第2章 程序結構 27
2.1 名字 27
2.2 聲明 28
2.3 變量 30
2.4 賦值 36
2.5 類型聲明 39
2.6 包和文件 41
2.7 作用域 45
第3章 基本數據類型 51
3.1 整數 51
3.2 浮點數 56
3.3 復數 61
3.4 布爾量 63
3.5 字符串 64
3.6 常量 75
第4章 復閤類型 81
4.1 數組 81
4.2 切片 84
4.3 鍵值對 93
4.4 結構體 99
4.5 JSON 107
4.6 文本和HTML模闆 113
第5章 函數 119
5.1 函數聲明 119
5.2 遞歸 121
5.3 多返迴值 124
5.4 錯誤 127
5.5 作為值的函數 132
5.6 匿名函數 135
5.7 變參函數 142
5.8 延後函數調用 143
5.9 崩潰 148
5.10 恢復 151
第6章 方法 155
6.1 方法聲明 155
6.2 帶有指針接收器的方法 158
6.3 包含嵌入結構體的復閤類型 161
6.4 作為值和錶達式的方法 164
6.5 示例:位嚮量類型 165
6.6 封裝 168
第7章 接口 171
7.1 作為規約的接口 171
7.2 接口類型 174
7.3 接口約定的達成 175
7.4 使用flag.Value進行標誌位分析 179
7.5 作為值的接口 181
7.6 使用sort.Interface進行排序 186
7.7 http.Handler接口 191
7.8 錯誤接口 196
7.9 示例:錶達式評估器 197
7.10 類型斷言 205
7.11 使用類型斷言分辨錯誤 206
7.12 使用接口類型斷言查詢行為 208
7.13 按類型的程序分支 210
7.14 示例:基於標記符號的XML解碼 213
7.15 幾句建議 216
第8章 goroutine和信道 217
8.1 goroutine 217
8.2 示例:並發時鍾服務器 219
8.3 示例:並發迴聲服務器 222
8.4 信道 225
8.5 並行循環 234
8.6 示例:並發Web爬蟲 239
8.7 使用select實現多工 244
8.8 示例:並發目錄遍曆 247
8.9 取消執行 251
8.10 示例:聊天服務器 253
第9章 使用共享變量實現並發 257
9.1 競險 257
9.2 互斥量:sync.Mutex 262
9.3 讀寫互斥量:sync.RWMutex 266
9.4 內存同步 267
9.5 緩式初始化:sync.Once 268
9.6 競險檢測器 271
9.7 示例:並發無阻塞式高速緩存 272
9.8 goroutine和綫程 280
第10章 包和go工具 283
10.1 概述 283
10.2 導入路徑 284
10.3 包聲明 285
10.4 導入聲明 285
10.5 空導入 286
10.6 包和命名 289
10.7 go工具 290
第11章 測試 301
11.1 go test工具 302
11.2 測試函數 302
11.3 覆蓋率 318
11.4 性能基準函數 321
11.5 性能剖析 323
11.6 示例函數 326
第12章 反射 329
12.1 為什麼會引入反射概念 329
12.2 reflect.Type和reflect.Value 330
12.3 遞歸值輸齣Display 333
12.4 示例:對S-錶達式編碼 338
12.5 使用reflect.Value給變量設置值 341
12.6 示例:對S-錶達式解碼 344
12.7 訪問結構體域標簽 348
12.8 列齣類型的方法 351
12.9 幾句忠告 352
第13章 低階程序設計 353
13.1 unsafe.Sizeof、Alignof和Offsetof 354
13.2 unsafe.Pointer 356
13.3 示例:深等價 358
13.4 使用cgo調用C代碼 361
13.5 再來幾句忠告 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
前言/序言
“Go是一種開放源代碼的程序設計語言,它意在使得人們能夠方便地構建簡單、可靠、高效的軟件。”(來自Go官網golang.org)Go形成構想是在2007年9月,並於2009年11月發布,其發明人是Robert Griesemer、Rob Pike和Ken Thompson,這幾位都任職於Google。該語言及其配套工具集意在使得編譯和執行都能夠富有錶達力和效率,而且使得程序員能夠輕鬆寫齣可靠、健壯的程序。
Go和C從錶麵上看起來相似,而且和C一樣,它也是一種專業程序員使用的工具,兼有事半功倍之效。但是Go遠不止是C的一種升級版本。它從多種其他語言中藉用和改造瞭不少好的思想,還避開瞭那些導緻復雜和脆弱的語言特性。它為並發提供的設施是全新的、高效的,它實現數據抽象和麵嚮對象的途徑是極其靈活的。它還提供瞭自動化的內存管理,或稱為垃圾收集。
Go特彆適用於構建基礎設施類軟件(如網絡服務器),以及程序員使用的工具和係統等。但它的的確確是一種通用語言,而且在諸多領域(如圖像處理、移動應用和機器學習)中都能發現它的身影。它在很多場閤下被用於替換無類型的腳本語言,這是由於它平衡瞭錶達力和安全性:Go程序通常比動態語言程序運行速度要快,遭遇意料之外的類型錯誤而導緻的崩潰更是少得多。
Go是個開源項目,所以其編譯器、庫和工具的源代碼是所有人皆可免費取得的。來自全世界的社區都在積極地嚮這個項目貢獻代碼。Go的運行環境包括類UNIX係統—Linux、FreeBSD、OpenBSD和Mac OS X,還有Plan 9和Microsoft Windows。隻要在這些環境之一中寫瞭一個程序,那麼基本上不加修改就可以運行在其他環境中。
本書旨在幫助你立刻開始使用Go,以及良好地掌握這門語言,並充分地利用Go的語言特性和標準庫來撰寫清晰的、符閤習慣用法的、高效的程序。
Go的起源和生物學物種一樣,成功的語言會繁衍後代,這些後代語言會從它們的祖先那裏汲取各種優點;有時候,語言間的混血會産生異常強大的力量;在一些罕見情況下,某個重大的語言特性也可能憑空齣現而並無先例。通過考察語言間的影響,我們可以學得不少知識,比如語言為什麼會變成這個樣子,以及它適配過哪些環境,等等。
下圖展示瞭更早齣現的程序設計語言對Go産生的最重要影響。
Go有時會被稱為“類C語言”或“21世紀的C”。從C中,Go繼承瞭錶達式語法、控製流語句、基本數據類型、按值調用的形參傳遞、指針,但比這些更重要的是,繼承瞭C所強調的程序要編譯成高效的機器碼,並自然地與所處的操作係統提供的抽象機製相配閤。
可是,Go的傢譜中還有其他祖先。産生主要影響的是來自Niklaus Wirth設計的、以Pascal為發端的一個語言支流。Modula-2啓發瞭包概念。Oberon消除瞭模塊接口文件和模塊實現文件的區隔。Oberon-2影響瞭包、導入和聲明語法。Object Oberon則提供瞭方法聲明語法。
另一支Go的世係祖先,也是使得Go相對於當下的程序設計顯得卓然不群者,是一族名不見經傳的、在貝爾實驗室開發的研究用語言。這些語言都受到瞭Tony Hoare於1978年發錶的關於並發性基礎的開創性論文所提齣的通信順序進程(Communicating Sequential Process,CSP)的啓發。在CSP中,程序就是一組無共享狀態進程的並行組閤,進程間的通信和同步采用信道完成。不過,Hoare提齣的CSP是一種形式語言,僅用以描述並發性的基本概念,並不是一種用來撰寫可執行程序的程序設計語言。
Rob Pike等人開始動手做一些實驗,嘗試把CSP實現為真正的語言。第一種這樣的語言稱為Squeak(“和鼠類溝通的語言”),它是一種用以處理鼠標和鍵盤事件的語言。緊接著它的是Newsqueak,它帶來的是類C的語句和錶達式語法,以及類Pascal的類型記法。它是一種純粹的函數式語言,帶有垃圾收集,同樣也以管理鍵盤、鼠標和窗口事件為目標。信道成瞭一等值(first-class value),它可以動態創建並采用變量存儲。
Plan 9操作係統將這些思想都納入瞭一種稱為Alef的語言。Alef嘗試將Newsqueak改造成一種可用的係統級程序設計語言,但垃圾收集的缺失使得它在處理並發性時太過痛苦瞭。
Go中的其他結構也會在這裏或那裏顯示齣某些並非來自祖先的基因。例如,iota多多少少有點APL的影子,而嵌套函數的詞法作用域則來自Scheme(以及由之而來的大部分語言)。在Go語言中,也可以發現全新的變異。Go的創新性的切片為動態數組提供瞭高效的隨機訪問的同時,也允許舊式鏈錶的復雜共享機製。還有,defer語句也是Go中新引入的。
Go項目所有的程序設計語言都反映瞭其發明者的程序設計哲學,這其中往往有相當大的一部分是對於此前的語言已知缺點的應對措施。Go這個項目也是誕生於挫敗感之中的,這種挫敗感來源於Google的若乾遭遇瞭復雜性爆炸性增長的軟件係統。(而這個問題絕非Google所獨有的。)“復雜性是以乘積方式增長的。”Rob Pike如是說。為瞭修復某個問題,一點點地將係統的某個部分變得更加復雜,這不可避免地也給其他部分增加瞭復雜性。在不斷要求增加係統功能和選項以及配置,還要快速發布的壓力之下,簡單性往往被忽視瞭—盡管長期來看,簡單性纔是好軟件的不二法門。
要實現簡單性,就要求在項目的一開始就將思想濃縮至本質,並在項目的整個生命期多保持一些自律,認識到哪些變化是好的,哪些是壞的或緻命的。隻要投入足夠的努力,好的變化就既可以實現目的,又能夠不損害軟件設計上的Fred Brooks所謂的“概念完整性”。壞的變化就做不到這一點,而緻命的變化則會犧牲“簡單性”而去換得其淺薄的兄弟概念—“方便性”。但是,隻有通過設計上的簡單性,係統纔能在增長過程中保持穩定、安全和自洽。
Go程序設計語言(英文版) epub pdf mobi txt 電子書 下載 2024
Go程序設計語言(英文版) 下載 epub mobi pdf txt 電子書