本書涵蓋以下內(nèi)容:如何建立模塊。如何調(diào)用另一個模塊中的代碼。如何返回出錯情況,如何處理錯誤。如何將字符串轉(zhuǎn)換成數(shù)字(或是將數(shù)字轉(zhuǎn)換成字符串)。如何修改字符串中的多個字符。如何用字符串中的部分內(nèi)容建立子串。如何捕獲用戶輸入的字符串。其他的許多話題。
編輯推薦
Go語言是一門日益流行的編程語言,能夠制作Web應用程序與分布式網(wǎng)絡(luò)服務(wù)等各種軟件產(chǎn)品。Go語言相對比較簡單,擁有C語言或Java語言基礎(chǔ)的開發(fā)者,應該能夠很快熟悉這門語言,然而它與C或Java之間,畢竟有著許多區(qū)別,于是開發(fā)者就會產(chǎn)生疑問:某項功能在Go語言里面,究竟應該如何實現(xiàn)?
本書是一本實用指南,其中的各個技巧能夠幫助讀者認清常見的問題,并拿出有效的Go語言解法。每個技巧都包含自成一體的范例代碼,你可以根據(jù)自身需求加以運用,另外,作者還討論了這些解決方案的運作原理。剛接觸Go語言的人,能夠在學習這些解法的過程中,迅速積累知識,有經(jīng)驗的Go語言開發(fā)者,則可以將這些行之有效的代碼,直接復制到自己的程序里面,以節(jié)省時間。
專家推薦
剛接觸Go語言的開發(fā)者,通常想要迅速學會如何實現(xiàn)各種常見的功能,然而又不太清楚最Z佳的實現(xiàn)方式是什么。Sau Sheong Chang寫的這本書,針對這些問題給出了答案。這是一份研究Go語言標準庫的優(yōu)秀學習資料。
Jon Bodner,
Datadog公司的Staff工程師,
《Learning Go》一書的作者
前言Go 語言已經(jīng)有十多年歷史了。它是在2009 年公布的,1.0 版本發(fā)布于2012 年3 月。從2013 年開始,這門語言的流行度就在穩(wěn)步上升,它經(jīng)常出現(xiàn)在最流行的十編程語言榜單里面。過去十年出現(xiàn)了量有關(guān)Go 語言的書,其中也包括筆者在2015 年寫的《Go Web Programming》。這門語言里面能夠?qū)懙膬?nèi)容,基本上全都有人寫過了,然而它畢竟在不斷地演化,同時還有新一代的程序員正在加入Go 語言開發(fā)者的行列。這本書源自一次博客訪談。2021 年9 月正值疫情期間,Natalie Pistunovich 主持了一個叫作Go Time的訪談播客,其中有一期名為Books that Teach Go,在那一期里面,筆者的朋友Bill Kennedy 跟我一起,談了與Go 語言有關(guān)的一些書。我提到了自己寫的《Go Web Programming》以及當時剛建立的Go Recipes 博客(https://go-recipes.dev),這個博客向讀者講解如何用Go 語言實現(xiàn)各種基本的功能。我打算穩(wěn)定地輸出一些技術(shù)知識,讓想要成為Go 語言開發(fā)者的人,以及有經(jīng)驗的Go 語言程序員,都能夠從中受益。做完那期播客之后,Natalie 告訴我,OReilly 正找人寫一本Go 語言的經(jīng)典實例。而筆者自己,當時也恰好在編寫Go 語言的技巧,所以我覺得,實在不應該錯過這次命運的安排。Natalie 讓我聯(lián)系OReilly,結(jié)果自然不用說,就是現(xiàn)在家看到的這本書了(當然我在這里還是要說說其中的一些經(jīng)過)。這本經(jīng)典實例與其他一些同類書籍相似,都不是專門針對新的語言性或某個定話題來講解的,而是要解釋一些常見功能的實現(xiàn)原理。筆者會把Go 語言開發(fā)者最有可能遇到的問題,盡可能多地覆蓋到。筆者注重的是涵蓋常見問題,而不是涵蓋所有問題。每一條技巧基本上都自成一體,筆者有時可能會在其中提到其他的技巧,但并不是說你必須先參考那些技巧,然后才能看懂當前這條。其中有些技巧可能顯得乏味枯燥,但是沒關(guān)系,書里還有許多功能類似的技巧供你選擇。排版約定本書采用以下排版約定。斜體(Italic)表示新術(shù)語、URL、電子郵件地址、文件名和文件擴展名。等寬字體(Constant width)表示程序清單,在段落內(nèi)表示程序元素,例如變量、函數(shù)名稱、數(shù)據(jù)庫、數(shù)據(jù)類型、環(huán)境變量、語句和關(guān)鍵字。粗體等寬字體(Constant width bold)表示應由用戶原封不動輸入的命令或其他文本。斜體等寬字體(Constant width italic)表示應該替換成用戶提供值的文本,或者由上下文決定的值。使用范例代碼本書的補充材料( 例如范例代碼、習題等), 可以從https://github.com/sausheong/gocookbook 下載。如果有技術(shù)問題或是在使用范例代碼時遇到困難,請發(fā)電子郵件至errata@oreilly.com.cn。本書是要幫你完成工作的。一般來說,如果本書提供了示例代碼,你可以把它用在你的程序或文檔中。除非你使用了很一部分代碼,否則無需聯(lián)系我們獲得許可。比如,用本書的幾個代碼片段寫一個程序就無需獲得許可,銷售或分發(fā)OReilly 圖書的示例集則需要獲得許可;引用本書中的示例代碼回答問題無需獲得許可,將書中量的代碼放到你的產(chǎn)品文檔中則需要獲得許可。我們很希望但并不強制要求你在引用本書內(nèi)容時加上引用說明。引用說明一般包括書名、作者、出版社和ISBN,例如:Go Cookbook by Sau Sheong Chang (OReilly). Copyright 2023 Sau Sheong Chang, 978-1-098-12211-9。如果你覺得你對代碼的用法已經(jīng)超出了合理使用的范圍,或者不知道它是否屬于剛才說的那幾種需要征得同意的情況,歡迎你通過permissions@oreilly.com詢問我們。OReilly 在線學習平臺(OReilly Online Learning)近40 年來,OReilly Media 致力于提供技術(shù)和商業(yè)培訓、知識和卓越見解,來幫助眾多公司取得成功。公司獨有的專家和改革創(chuàng)新者網(wǎng)絡(luò)通過OReilly 書籍、文章以及在線學習平臺,分享他們的專業(yè)知識和實踐經(jīng)驗。OReilly 在線學習平臺按照您的需要提供實時培訓課程、深入學習渠道、交互式編程環(huán)境以及來自O(shè)Reilly 和其他200 多家出版商的量書籍與視頻資料。更多信息,請訪問網(wǎng)站:https://www.oreilly.com/。聯(lián)系我們?nèi)魏斡嘘P(guān)本書的意見或疑問,請按照以下地址聯(lián)系出版社。美國:OReilly Media, Inc.1005 Gravenstein Highway NorthSebastopol, CA 95472中國:北京市西城區(qū)西直門南街2 號成銘廈C 座807 室(100035)奧萊利技術(shù)咨詢(北京)有限公司這本書在OReilly 網(wǎng)站上面有相應的網(wǎng)頁,其中包含勘誤表、范例代碼,以及其他一些附加信息。這個頁面的網(wǎng)址是:https://oreil.ly/go-cookbook。與我們的書籍和課程有關(guān)的新聞及信息,參見https://oreilly.com 網(wǎng)站。我們的LinkedIn:https://linkedin.com/company/oreilly-media。我們的Twitter:https://twitter.com/oreillymedia。我們的YouTube:https://youtube.com/oreillymedia。致謝筆者想要感謝妻子Angela Lim 與兒子Chang Kai Wen 容許并支持我再寫一本書,感謝你們耐心地看著我在夜間或周末寫書。家里有人是寫書的,這感覺可不太好受,但他們(至少我認為他們)還是很好地接受了。筆者要感謝Natalie Pistunovich 介紹我認識OReilly 并幫我審閱本書草稿中的各章。還要感謝Jon Bodner 與Jess Males 給我以鼓勵并向我提供意見與良好的建議,這對我有很的幫助。感謝SP Group、Temasek 與GovTech Singapore 的諸位前同事及現(xiàn)同事的支持與鼓勵。這里恕不一一列出你們的名字,但我想你們都應該知道自己在這個名單里面,感謝你們始終支持我。作者離不開讀者。我要感謝所有博客文章的讀者,以及對我博客網(wǎng)站(https://sausheong.com)上面涉及Go 語言與其他技術(shù)的文章表示關(guān)注的人。家長久以來的支持給了我極動力,你們肯花時間讀這些文章,我對此深表感激。謝謝家。最后,要感謝已故的父親Chang Yoon Sang,他于去年十一月逝世。父親總是毫無保留地強烈支持我做的每一件事?吹轿乙苍趯憰绕涓吲d(父親是中醫(yī)師與營養(yǎng)師,用中文撰寫這兩方面的書籍)。我知道自己的這些書他讀起來稍顯困難,因為他不是做技術(shù)的,但父親還是以我為傲,我寫的每一本書,包括譯作,他都問我要去,他想把我的書擺滿整個書架。我最的遺憾,就是他沒有機會把現(xiàn)在的這本書也加進去。謹將本書獻給我的父親。
Sau Sheong Chang是一位擁有28年經(jīng)驗的軟件開發(fā)者,在各個領(lǐng)域使用多項技術(shù)制作軟件產(chǎn)品。他是各種Java、Ruby與Go語言軟件開發(fā)社群的活躍成員。他還組織過meetup,并在各種會議上面做過演講。
目錄
前言 1
第1 章 入門級的技巧 .7
1.0 引言 7
1.1 安裝Go 語言的開發(fā)環(huán)境 7
1.2 試用Go 語言 10
1.3 編寫Hello World 程序 11
1.4 使用外部包 13
1.5 處理錯誤15
1.6 記錄事件17
1.7 測試代碼18
第2 章 與模塊有關(guān)的技巧 .23
2.0 引言 .23
2.1 創(chuàng)建Go 模塊 25
2.2 在模塊中引入它所依賴的軟件包 .26
2.3 從模塊中移除不再依賴的軟件包 .30
2.4 尋找第三方軟件包的可用版本 32
2.5 引入模塊所依賴的某個軟件包的定版本 .33
2.6 保留某個依賴包的本地版本 35
2.7 依賴同一個包的多個版本 41
第3 章 與錯誤處理有關(guān)的技巧 45
3.0 引言 .45
3.1 處理錯誤47
3.2 簡化重復的錯誤處理代碼 49
3.3 創(chuàng)建自定義的錯誤 52
3.4 把原始的錯誤包裝成另一種錯誤 .54
3.5 檢視錯誤值 56
3.6 用panic 函數(shù)處理錯誤 58
3.7 從panic 之中恢復 .61
3.8 處理中斷信號 .64
第4 章 與日志記錄有關(guān)的技巧 67
4.0 引言 .67
4.1 將事件記入日志 67
4.2 對打印至標準logger 的日志內(nèi)容做出修改 .71
4.3 把日志內(nèi)容寫到文件里面 73
4.4 將各種級別的日志分別記入相應的logger 74
4.5 通過操作系統(tǒng)的日志服務(wù)來記錄事件 79
第5 章 與函數(shù)有關(guān)的技巧 .85
5.0 引言 .85
5.1 定義函數(shù)85
5.2 讓同一個函數(shù)能夠接受多種類型的數(shù)據(jù) 87
5.3 讓函數(shù)接受數(shù)量可變的參數(shù) 90
5.4 讓函數(shù)接受任意類型的參數(shù) 92
5.5 創(chuàng)建匿名函數(shù) .96
5.6 創(chuàng)建一種在調(diào)用完之后能夠保留狀態(tài)的函數(shù) .98
第6 章 與字符串有關(guān)的技巧 103
6.0 引言 103
6.1 創(chuàng)建字符串 103
6.2 在字符串與字節(jié)數(shù)組之間互相轉(zhuǎn)換106
6.3 把多個字符串或其他類型的數(shù)據(jù)連成一個字符串 .106
6.4 把字符串轉(zhuǎn)換成數(shù)值 111
6.5 把數(shù)值轉(zhuǎn)換成字符串 114
6.6 替換某個字符串中的多個字符 117
6.7 從字符串中提取子串 120
6.8 判斷某個字符串之中是否有另一個字符串 122
6.9 把字符串拆分成小字符串數(shù)組,或者把數(shù)組中的小字符串
合成一個字符串 123
6.10 刪除字符串首尾的多余字符 126
6.11 把用戶在命令行界面中輸入的字符串捕獲下來 128
6.12 對字符串做HTML 轉(zhuǎn)義與HTML 反轉(zhuǎn)義操作 131
6.13 使用正則表達式 133
第7 章 與通用I/O 有關(guān)的技巧 139
7.0 引言 139
7.1 從輸入端讀取數(shù)據(jù) .140
7.2 向輸出端寫入數(shù)據(jù) .141
7.3 將數(shù)據(jù)從Reader 復制到Writer 143
7.4 從文本文件中讀取數(shù)據(jù) 147
7.5 向文本文件中寫入數(shù)據(jù) 149
7.6 使用臨時文件 151
第8 章 與CSV 有關(guān)的技巧 155
8.0 引言 155
8.1 讀取整份CSV 文件 156
8.2 每次只從CSV 文件里面讀取一行數(shù)據(jù) 157
8.3 把CSV 文件中的數(shù)據(jù)拆解成結(jié)構(gòu)體 158
8.4 移除標題行 159
8.5 處理不用逗號做分隔符的CSV 文件 160
8.6 忽略CSV 文件中的某些行 161
8.7 向CSV 文件中寫入數(shù)據(jù) 162
8.8 每次只向文件中寫入一行數(shù)據(jù) 164
第9 章 與JSON 有關(guān)的技巧 . 165
9.0 引言 165
9.1 把JSON 數(shù)據(jù)解析成結(jié)構(gòu)體 .165
9.2 解析非結(jié)構(gòu)化的JSON 數(shù)據(jù) .169
9.3 把JSON 數(shù)據(jù)流解析成結(jié)構(gòu)體 174
9.4 根據(jù)結(jié)構(gòu)體創(chuàng)建字節(jié)數(shù)組型的JSON 數(shù)據(jù) 182
9.5 根據(jù)結(jié)構(gòu)體建立JSON 數(shù)據(jù)流 185
9.6 忽略結(jié)構(gòu)體中的某些字段 .189
第10 章 與二進制數(shù)據(jù)有關(guān)的技巧 193
10.0 引言 193
10.1 將數(shù)據(jù)編碼為gob 格式 194
10.2 將gob 格式的數(shù)據(jù)解碼為結(jié)構(gòu)體 196
10.3 把數(shù)據(jù)編碼成自定義的二進制格式 199
10.4 從自定義的二進制格式中解碼數(shù)據(jù) 203
第11 章 與日期和時間有關(guān)的技巧 207
11.0 引言 207
11.1 查詢當前時間 208
11.2 用時間值做運算 208
11.3 表示日期 209
11.4 表示時區(qū) 210
11.5 表示時間段 .212
11.6 讓程序暫停一段時間 .214
11.7 測量經(jīng)過的時間 214
11.8 調(diào)整時間的顯示格式 .219
11.9 把時間字符串解析成Time 結(jié)構(gòu)體 .224
第12 章 與結(jié)構(gòu)體有關(guān)的技巧 229
12.0 引言 229
12.1 定義結(jié)構(gòu)體 .230
12.2 為結(jié)構(gòu)體創(chuàng)建方法 233
12.3 創(chuàng)建并使用接口 236
12.4 創(chuàng)建結(jié)構(gòu)體實例 239
12.5 創(chuàng)建只用一次的結(jié)構(gòu)體 244
12.6 把其他結(jié)構(gòu)體組合進來 247
12.7 給結(jié)構(gòu)體字段定義元數(shù)據(jù)251
第13 章 與基本數(shù)據(jù)結(jié)構(gòu)有關(guān)的技巧 255
13.0 引言 255
13.1 創(chuàng)建數(shù)組或切片 256
13.2 訪問數(shù)組或切片 259
13.3 修改數(shù)組或切片 261
13.4 在并發(fā)環(huán)境下正確地使用數(shù)組或切片 266
13.5 給數(shù)組或切片中的元素排序 271
13.6 創(chuàng)建map 276
13.7 訪問map 277
13.8 修改map 280
13.9 給map 排序 280
第14 章 與其他數(shù)據(jù)結(jié)構(gòu)有關(guān)的技巧 283
14.0 引言 283
14.1 創(chuàng)建隊列 284
14.2 創(chuàng)建棧 287
14.3 創(chuàng)建集 289
14.4 創(chuàng)建鏈表 295
14.5 創(chuàng)建堆 301
14.6 創(chuàng)建圖 307
14.7 尋找圖中的最短路徑 .312
第15 章 與圖像處理有關(guān)的技巧 319
15.0 引言 319
15.1 從文件中加載圖像 321
15.2 將圖像保存至文件 323
15.3 創(chuàng)建圖像 324
15.4 將圖像上下反轉(zhuǎn) 325
15.5 對圖像做灰階處理 330
15.6 縮放圖像 332
第16 章 與網(wǎng)絡(luò)有關(guān)的技巧 335
16.0 引言 335
16.1 創(chuàng)建TCP 服務(wù)器 .337
16.2 創(chuàng)建TCP 客戶端 .342
16.3 創(chuàng)建UDP 服務(wù)器.344
16.4 創(chuàng)建UDP 客戶端.347
第17 章 與Web 開發(fā)有關(guān)的技巧 . 351
17.0 引言 351
17.1 建立一款簡單的Web 應用程序 353
17.2 處理HTTP 請求 356
17.3 處理HTML 表單 .360
17.4 向Web 應用程序上傳文件 .363
17.5 向客戶端提供靜態(tài)文件 365
17.6 建立提供JSON 數(shù)據(jù)的Web Service API 371
17.7 通過HTTPS 協(xié)議提供服務(wù) 374
17.8 使用Go 語言的模板引擎開發(fā)Web 應用程序 378
17.9 發(fā)出HTTP 客戶端請求 384
第18 章 與功能測試有關(guān)的技巧 391
18.0 引言 391
18.1 讓功能測試得以自動化 392
18.2 在同一個測試函數(shù)里面運行多個測試用例 394
18.3 在開始測試前與結(jié)束測試后分別執(zhí)行setup 與teardown 邏輯 .396
18.4 建立子測試,以求更為精細地控制某一組測試用例.399
18.5 并行地運行測試 404
18.6 生成隨機的輸入數(shù)據(jù),以便用這些數(shù)據(jù)做測試 411
18.7 計算測試覆蓋率 419
18.8 測試Web 應用程序或Web 服務(wù) 423
第19 章 與性能測試有關(guān)的技巧 427
19.0 引言 427
19.1 讓性能測試得以自動化 427
19.2 讓功能測試不要隨著性能測試一起執(zhí)行 .430
19.3 把設(shè)置Test Fixture 所耗費的時間,從性能測試的結(jié)果中排除掉 .431
19.4 修改性能測試的運行時長或輪數(shù) 435
19.5 在同一個benchmark 函數(shù)里面運行多個性能測試用例 437
19.6 在性能測試的結(jié)果之間對比 439
19.7 給程序做Profiling(性能分析) .444