關(guān)于我們
書(shū)單推薦
新書(shū)推薦
|
深入淺出Go語(yǔ)言編程 讀者對(duì)象:本書(shū)適用于程序設(shè)計(jì)初、中級(jí)讀者
本書(shū)首先介紹Go語(yǔ)言的基本概念,并通過(guò)“hello world”程序引導(dǎo)讀者熟悉Go的工具鏈。接下來(lái)逐步深入,介紹面向包的設(shè)計(jì)、測(cè)試框架、錯(cuò)誤與異常處理等內(nèi)容。第8章開(kāi)始探討指針和內(nèi)存逃逸分析。隨后的章節(jié)涉及數(shù)據(jù)結(jié)構(gòu)、面向?qū)ο蠛徒涌诰幊痰群诵闹R(shí)。從第15章開(kāi)始,重點(diǎn)轉(zhuǎn)向并發(fā)編程,從基本的并發(fā)模式到復(fù)雜的并發(fā)原理,再到內(nèi)存管理和垃圾回收等高級(jí)主題。最后幾章關(guān)注實(shí)際開(kāi)發(fā)中的問(wèn)題,如使用標(biāo)準(zhǔn)庫(kù)和第三方庫(kù)、性能問(wèn)題分析與追蹤,以及重構(gòu)“hello world”示例代碼。
阮正平,高級(jí)工程師,擁有十多年軟件開(kāi)發(fā)設(shè)計(jì)經(jīng)驗(yàn)。擅長(zhǎng)Golang、Docker、Kubernetes、數(shù)據(jù)庫(kù)等技術(shù),主要研究方向?yàn)樵圃、?shù)據(jù)庫(kù)、區(qū)塊鏈。目前任某公司架構(gòu)師,負(fù)責(zé)公司的Serverless PaaS平臺(tái)設(shè)計(jì)和開(kāi)發(fā),助力企業(yè)從傳統(tǒng)應(yīng)用遷移至云原生應(yīng)用。 杜軍,浙大SEL實(shí)驗(yàn)室碩士,國(guó)內(nèi)早期的一批容器技術(shù)布道師。對(duì)云計(jì)算技術(shù)演進(jìn)與內(nèi)在驅(qū)動(dòng)力有深刻見(jiàn)解,主要研究方向?yàn)槿萜鳌⑽⒎⻊?wù)、DevOps、邊緣計(jì)算。 第 1 章 Go 語(yǔ)言初探 1 1.1 Go 語(yǔ)言的發(fā)展里程碑 1 1.2 云時(shí)代 Go 語(yǔ)言的發(fā)展趨勢(shì) 2 1.3 Go 語(yǔ)言?xún)?yōu)秀的語(yǔ)言特性 3 1.3.1 “少即是多”的設(shè)計(jì)哲學(xué) 3 1.3.2 強(qiáng)大的 runtime 4 1.3.3 面向接口編程 5 1.3.4 為工程服務(wù)的語(yǔ)言 6 1.3.5 自帶標(biāo)準(zhǔn)化的測(cè)試框架 7 1.3.6 豐富的標(biāo)準(zhǔn)庫(kù)和第三方庫(kù) 7 1.4 強(qiáng)大的生態(tài)圈和成功案例 8 1.5 Go 程序是如何運(yùn)行的 8 1.6 plan9 與 Go 語(yǔ)言 10 1.6.1 寄存器 10 1.6.2 Go 語(yǔ)言的反匯編方法 11 1.6.3 反匯編的查看示例 13 第 2 章 “hello world”與工具鏈 15 2.1 Go 語(yǔ)言的安裝和配置 15 2.1.1 下載和安裝 15 2.1.2 配置 Go 語(yǔ)言的環(huán)境變量 15 2.1.3 查看配置信息 16 2.2 第 一個(gè)程序“hello world” 16 2.2.1 “hello world”程序的代碼說(shuō)明 17 2.2.2 代碼的編譯與運(yùn)行 21 2.2.3 “hello world”示例總結(jié) 21 2.3 Go 語(yǔ)言的工具鏈命令 22 2.3.1 與編譯執(zhí)行有關(guān)的工具鏈命令 22 2.3.2 獲取與安裝第三方包 22 2.3.3 工具包組合命令 go tool 23 2.3.4 跨平臺(tái)交叉編譯 23 2.3.5 網(wǎng)絡(luò)代理 GOPROXY 24 第 3 章 Go 語(yǔ)言的基礎(chǔ)知識(shí) 26 3.1 Go 語(yǔ)言的常用規(guī)范 26 3.1.1 命名與注釋 26 3.1.2 聲明 27 3.1.3 對(duì)變量賦值 28 3.1.4 包和文件 28 3.2 數(shù)據(jù)類(lèi)型 29 3.2.1 基本類(lèi)型 29 3.2.2 非引用類(lèi)型和引用類(lèi)型 31 3.2.3 用戶(hù)自定義類(lèi)型 32 3.2.4 類(lèi)型別名 32 3.2.5 傳參方式 33 3.3 變量的本質(zhì) 33 3.3.1 類(lèi)型的兩個(gè)要素 33 3.3.2 變量的聲明 34 3.3.3 零值機(jī)制 35 3.3.4 短變量聲明與類(lèi)型轉(zhuǎn)換 35 3.4 常量 36 3.4.1 常量 iota 37 3.4.2 常量的類(lèi)型提升機(jī)制 38 3.5 運(yùn)算符 38 3.5.1 算術(shù)運(yùn)算符 39 3.5.2 比較運(yùn)算符 39 3.5.3 邏輯運(yùn)算符 39 3.5.4 位運(yùn)算符 40 3.5.5 賦值運(yùn)算符 40 3.5.6 指針運(yùn)算符 41 3.6 結(jié)構(gòu)化語(yǔ)法 41 3.6.1 循環(huán)結(jié)構(gòu) 41 3.6.2 條件語(yǔ)句 42 3.6.3 switch-case 語(yǔ)句 42 3.6.4 控制或跳出循環(huán)語(yǔ)句的關(guān)鍵字 43 3.7 類(lèi)型轉(zhuǎn)換 43 3.7.1 轉(zhuǎn)換的語(yǔ)法 44 3.7.2 類(lèi)型斷言 44 3.8 Go 語(yǔ)言的語(yǔ)法糖 44 3.8.1 短變量聲明和new 函數(shù) 44 3.8.2 符號(hào)“”與切片 44 3.8.3 for range 45 第 4 章 面向包的設(shè)計(jì)與依賴(lài)管理 46 4.1 包的使用 46 4.1.1 包的概述 46 4.1.2 包的查找方式 47 4.1.3 包加載的順序 48 4.1.4 包中 init 函數(shù)的加載 49 4.1.5 包加載順序的示例 49 4.1.6 包的使用總結(jié) 50 4.2 面向包的設(shè)計(jì) 50 4.3 包管理工具 Go Module 51 4.3.1 包管理的方式 51 4.3.2 Go Module 簡(jiǎn)介 52 4.3.3 開(kāi)啟 Go Module 52 4.3.4 Go Module 的優(yōu)點(diǎn) 52 4.3.5 使用 Go Module 53 4.3.6 go.mod 文件中的命令 57 4.3.7 升級(jí)依賴(lài)包的方法 58 4.3.8 依賴(lài)包版本的選擇 58 4.3.9 語(yǔ)義版本的導(dǎo)入路徑語(yǔ)法 58 4.3.10 Go Module 的使用總結(jié) 59 第 5 章 測(cè)試框架 60 5.1 Go 語(yǔ)言中的測(cè)試框架 60 5.1.1 測(cè)試使用的約定 60 5.1.2 標(biāo)準(zhǔn)庫(kù) testing 的輔助功能函數(shù) 61 5.1.3 測(cè)試框架示例 61 5.1.4 使用測(cè)試命令 62 5.2 單元測(cè)試 63 5.2.1 指定測(cè)試用例 63 5.2.2 單元測(cè)試之子測(cè)試 64 5.2.3 幫助函數(shù) 64 5.3 測(cè)試代碼的覆蓋率 65 5.4 斷言 66 5.5 基準(zhǔn)測(cè)試 67 5.5.1 基準(zhǔn)測(cè)試場(chǎng)景 67 5.5.2 基準(zhǔn)測(cè)試的方法 67 5.5.3 基準(zhǔn)測(cè)試之子測(cè)試 68 5.5.4 基準(zhǔn)測(cè)試示例 68 5.6 與網(wǎng)絡(luò)有關(guān)的模擬測(cè)試 70 5.7 與測(cè)試有關(guān)的第三方工具 71 5.7.1 gomock 71 5.7.2 BDD 71 第 6 章 錯(cuò)誤與異常處理 73 6.1 error 的引入 73 6.1.1 預(yù)定義的錯(cuò)誤類(lèi)型 74 6.1.2 快速創(chuàng)建錯(cuò)誤類(lèi)型 74 6.1.3 自定義錯(cuò)誤 75 6.1.4 接口在錯(cuò)誤處理上的妙用 76 6.1.5 自定義錯(cuò)誤的陷阱 77 6.1.6 獲取和處理錯(cuò)誤 78 6.1.7 Go 語(yǔ)言作者關(guān)于錯(cuò)誤處理的觀點(diǎn) 78 6.2 異常處理 79 6.2.1 panic 的使用 79 6.2.2 defer 函數(shù)的設(shè)計(jì)與使用陷阱 79 6.2.3 recover 函數(shù)的使用 81 6.3 面向錯(cuò)誤和恢復(fù)的設(shè)計(jì) 82 6.4 帶堆棧信息的 error 83 6.5 標(biāo)準(zhǔn)庫(kù) errors 的改進(jìn) 84 6.6 errGroup 對(duì)象 86 6.7 日志系統(tǒng)的引入 87 6.7.1 日志概述 88 6.7.2 第三方日志框架 88 第 7 章 編碼與字符串 89 7.1 字符編碼 89 7.1.1 字符的編碼方式 89 7.1.2 使用字符類(lèi)型的注意事項(xiàng) 90 7.2 字符串 90 7.2.1 字符串的聲明和初始化 90 7.2.2 字符串的數(shù)據(jù)結(jié)構(gòu) 90 7.2.3 遍歷字符串 91 7.2.4 字符串的長(zhǎng)度問(wèn)題 92 7.2.5 字符串的備份 92 7.2.6 字符串拼接 92 7.3 字符串與基本類(lèi)型互轉(zhuǎn) 94 第 8 章 指針與內(nèi)存逃逸分析 96 8.1 活動(dòng)幀的作用 96 8.2 值語(yǔ)義的本質(zhì) 98 8.3 指針 99 8.3.1 指針的由來(lái) 99 8.3.2 指針和指針類(lèi)型 100 8.3.3 使用指針運(yùn)算符的注意事項(xiàng) 101 8.3.4 nil 指針 101 8.3.5 指針數(shù)組與數(shù)組指針 102 8.3.6 關(guān)于指針的補(bǔ)充說(shuō)明 102 8.4 內(nèi)存逃逸分析 103 8.4.1 內(nèi)存逃逸分析的由來(lái) 103 8.4.2 內(nèi)存逃逸分析的作用 103 8.4.3 兩種情況會(huì)引起內(nèi)存逃逸分析 103 8.4.4 內(nèi)存逃逸分析示例 104 8.4.5 函數(shù)內(nèi)聯(lián) 106 8.4.6 手動(dòng)控制內(nèi)存逃逸分析 107 8.5 引用類(lèi)型與深、淺拷貝 108 第 9 章 數(shù)據(jù)結(jié)構(gòu) 109 9.1 面向數(shù)據(jù)的設(shè)計(jì) 109 9.1.1 編碼和硬件 109 9.1.2 可預(yù)測(cè)的內(nèi)存訪(fǎng)問(wèn)模式 111 9.2 數(shù)組 111 9.2.1 數(shù)組的聲明及初始化 112 9.2.2 數(shù)組在內(nèi)存中的形式 112 9.2.3 遍歷數(shù)組 113 9.2.4 數(shù)組的截取 113 9.2.5 數(shù)組的反轉(zhuǎn) 114 9.3 切片 114 9.3.1 切片的設(shè)計(jì) 114 9.3.2 切片的創(chuàng)建與初始化 116 9.3.3 切片的長(zhǎng)度與容量 117 9.3.4 nil 切片和空切片 117 9.3.5 切片的共享底層數(shù)組 118 9.3.6 append 函數(shù)與切片的擴(kuò)容 119 9.3.7 append 函數(shù)引發(fā)的內(nèi)存泄漏 121 9.3.8 三下標(biāo)切片 122 9.3.9 切片的復(fù)制 122 9.3.10 切片的比較 122 9.3.11 刪除切片中的元素 123 9.3.12 特殊的切片:字符串 125 9.3.13 數(shù)組與切片的對(duì)比 125 9.4 映射 125 9.4.1 選擇合適的鍵值類(lèi)型 126 9.4.2 映射的聲明和初始化 127 9.4.3 映射的使用 128 9.4.4 映射的排序 129 9.4.5 映射的擴(kuò)容 130 9.4.6 映射的并發(fā)安全性 130 9.4.7 映射的刪除機(jī)制 132 9.4.8 映射的設(shè)計(jì) 133 9.5 數(shù)據(jù)結(jié)構(gòu)中的常見(jiàn)問(wèn)題 138 9.5.1 make 與 new 的差異 138 9.5.2 使用引用類(lèi)型前先分配空間 139 9.5.3 可能發(fā)生內(nèi)存泄漏的情況 139 第 10 章 結(jié)構(gòu)體與內(nèi)存對(duì)齊 140 10.1 結(jié)構(gòu)體 140 10.1.1 結(jié)構(gòu)體的定義 140 10.1.2 結(jié)構(gòu)體的初始化 142 10.1.3 結(jié)構(gòu)體的類(lèi)型轉(zhuǎn)換 143 10.1.4 結(jié)構(gòu)體比較 143 10.1.5 結(jié)構(gòu)體的值 144 10.2 序列化與反序列化 145 10.2.1 序列化 145 10.2.2 反序列化 145 10.2.3 使用 tag 146 10.3 unsafe 包 147 10.3.1 unsafe.Pointer 類(lèi)型 147 10.3.2 unsafe 包簡(jiǎn)介 147 10.3.3 unsafe 包中的函數(shù) 148 10.3.4 unsafe 包的使用方式 150 10.4 內(nèi)存對(duì)齊 152 10.4.1 內(nèi)存對(duì)齊的概念 152 10.4.2 數(shù)據(jù)類(lèi)型的尺寸 153 10.4.3 內(nèi)存自動(dòng)對(duì)齊 153 10.4.4 內(nèi)存對(duì)齊的示例 154 第 11 章 函數(shù) 155 11.1 認(rèn)識(shí)函數(shù) 155 11.1.1 函數(shù)的定義 155 11.1.2 函數(shù)的種類(lèi) 156 11.2 defer 函數(shù) 158 11.2.1 defer 函數(shù)的使用場(chǎng)景 158 11.2.2 當(dāng) panic 遇到defer 函數(shù) 159 11.2.3 defer 函數(shù)與for 循環(huán)語(yǔ)句 160 11.3 作為數(shù)據(jù)類(lèi)型的函數(shù) 161 11.4 函數(shù)類(lèi)型的使用場(chǎng)景 161 11.4.1 匿名函數(shù) 161 11.4.2 回調(diào)函數(shù) 162 11.4.3 閉包 163 11.5 函數(shù)的別名 165 第 12 章 面向“對(duì)象”編程 166 12.1 封裝 166 12.1.1 方法 166 12.1.2 方法的聲明方式 167 12.1.3 接收者類(lèi)型與接收者基礎(chǔ)類(lèi)型 167 12.1.4 接收者使用的語(yǔ)義 168 12.1.5 兩種語(yǔ)義本質(zhì)上的區(qū)別 169 12.1.6 解耦帶來(lái)的問(wèn)題 170 12.1.7 更為復(fù)雜的調(diào)用方式 170 12.1.8 隱式轉(zhuǎn)換 171 12.1.9 關(guān)于封裝的總結(jié) 173 12.2 繼承 173 12.2.1 Go 語(yǔ)言不支持繼承 173 12.2.2 用“內(nèi)嵌+組合”替代繼承 174 12.2.3 擴(kuò)展已有的包 175 12.3 多態(tài) 176 12.3.1 接口的定義 176 12.3.2 鴨子類(lèi)型 176 12.3.3 接口與協(xié)議 178 12.3.4 接口如何實(shí)現(xiàn)多態(tài) 178 第 13 章 面向接口編程 180 13.1 接口編程哲學(xué) 180 13.2 接口與組合 181 13.2.1 接口的設(shè)計(jì)準(zhǔn)則 181 13.2.2 接口與組合示例 182 13.2.3 組合的多樣化 183 13.3 接口的剖析 183 13.3.1 與接口相關(guān)的說(shuō)明 183 13.3.2 空接口與包裹 184 13.3.3 實(shí)現(xiàn)接口類(lèi)型 185 13.3.4 接口包裹非接口值 185 13.3.5 接口與多態(tài) 185 13.3.6 接口類(lèi)型斷言 186 13.3.7 強(qiáng)制轉(zhuǎn)換接口類(lèi)型 187 13.3.8 接口類(lèi)型與隱式聲明 187 13.3.9 類(lèi)型轉(zhuǎn)換的時(shí)間復(fù)雜度 188 13.4 接口的設(shè)計(jì)原則 188 13.4.1 錯(cuò)誤的接口設(shè)計(jì) 189 13.4.2 基于數(shù)據(jù)驅(qū)動(dòng)的接口設(shè)計(jì) 189 13.4.3 類(lèi)型斷言在 API 設(shè)計(jì)中的應(yīng)用 189 13.4.4 接口設(shè)計(jì)的建議 190 13.5 檢查接口的實(shí)現(xiàn) 190 13.6 空接口與類(lèi)型斷言 193 13.7 接口值的比較 194 13.8 檢查運(yùn)行階段的接口類(lèi)型 195 第 14 章 反射 196 14.1 反射的概念 196 14.2 接口與反射 198 14.2.1 靜態(tài)類(lèi)型與動(dòng)態(tài)類(lèi)型 198 14.2.2 空接口 199 14.2.3 類(lèi)型的底層分析 199 14.3 反射包介紹 201 14.3.1 理解反射對(duì)象的轉(zhuǎn)換機(jī)制 201 14.3.2 reflect.Type 接口的轉(zhuǎn)換方式 202 14.3.3 reflect.Value 結(jié)構(gòu)體類(lèi)型的使用方法 204 14.4 反射包的使用示例 207 14.4.1 獲取變量的類(lèi)型和值 208 14.4.2 獲取結(jié)構(gòu)體的屬性和方法 209 14.4.3 動(dòng)態(tài)調(diào)用方法和傳值 209 14.4.4 修改接口值 210 14.4.5 判斷結(jié)構(gòu)體實(shí)現(xiàn)了哪個(gè)接口 211 14.5 反射的三個(gè)定律 212 14.6 反射的應(yīng)用場(chǎng)景 212 14.7 反射的性能 213 第 15 章 并發(fā)編程 214 15.1 感受并發(fā)的魅力 214 15.1.1 并發(fā)和并行 214 15.1.2 并發(fā)帶來(lái)的好處 215 15.1.3 “hello goroutine” 215 15.1.4 協(xié)程的執(zhí)行順序 216 15.1.5 控制協(xié)程的幾種方式 216 15.2 sync.WaitGroup 217 15.2.1 sync.WaitGroup 的三個(gè)方法 217 15.2.2 使用 sync.WaitGroup 的模板 217 15.2.3 使用 sync.WaitGroup 時(shí)的注意事項(xiàng) 218 15.2.4 為 sync.WaitGroup 增加額外的功能 218 15.3 數(shù)據(jù)競(jìng)爭(zhēng)問(wèn)題 219 15.3.1 臨界區(qū) 219 15.3.2 數(shù)據(jù)競(jìng)爭(zhēng)的檢測(cè)方法 219 15.3.3 解決臨界區(qū)的數(shù)據(jù)安全問(wèn)題 220 15.4 傳統(tǒng)的鎖 221 15.4.1 鎖的概念 221 15.4.2 互斥鎖 Mutex 222 15.4.3 Mutex 的工作模式 224 15.4.4 讀寫(xiě)鎖 RWMutex 224 15.4.5 重入與 TryLock 226 15.5 原子操作介紹 227 15.5.1 Go 語(yǔ)言中的原子操作 228 15.5.2 atomic 包的使用 228 第 16 章 并發(fā)與通道 230 16.1 通道的行為 230 16.2 創(chuàng)建通道 231 16.3 通道的特性 231 16.3.1 通道的成對(duì)性 231 16.3.2 通道的阻塞性 232 16.3.3 通道與死鎖 232 16.3.4 讓出當(dāng)前協(xié)程的執(zhí)行權(quán) 233 16.3.5 關(guān)閉通道 234 16.3.6 遍歷通道 236 16.4 通道的其他特性 237 16.4.1 帶緩沖的通道 237 16.4.2 緩沖區(qū)與延遲保障 238 16.4.3 通道的方向 239 16.4.4 通道的狀態(tài) 239 16.5 通道的使用建議 239 16.6 select 機(jī)制 240 16.6.1 select 機(jī)制的介紹與示例 241 16.6.2 select 與超時(shí)控制 242 16.7 通道的模式 243 16.7.1 等待任務(wù)模式 243 16.7.2 等待結(jié)果模式 244 16.7.3 等待完成模式 246 16.7.4 Pooling 模式 247 16.7.5 流水線(xiàn)模式 248 16.7.6 FanOut/FanIn 模式 249 16.7.7 Drop 模式 251 第 17 章 其他并發(fā)技術(shù) 252 17.1 context 包 252 17.1.1 context 包的使用場(chǎng)景 253 17.1.2 context 包中的接口和函數(shù) 253 17.1.3 context 包的使用流程 254 17.1.4 context.Context 接口 255 17.1.5 生成 Context 的方法 255 17.1.6 Context 與請(qǐng)求超時(shí) 258 17.1.7 Context 的使用總結(jié) 260 17.2 sync.Cond 261 17.3 sync.Once 262 17.4 sync.Map 263 17.5 sync.Pool 265 17.5.1 sync.Pool 的介紹 265 17.5.2 緩存對(duì)象的生命周期 266 17.5.3 sync.Pool 的使用場(chǎng)景及存在的問(wèn)題 267 17.6 實(shí)現(xiàn)對(duì)象池 268 17.7 常用連接池 269 17.8 并發(fā)技術(shù)選型 270 第 18 章 并發(fā)原理 271 18.1 怎樣讓程序跑得更快 271 18.1.1 從單進(jìn)程到多線(xiàn)程 271 18.1.2 工作任務(wù)的種類(lèi) 272 18.2 Go 語(yǔ)言中的協(xié)程 273 18.2.1 內(nèi)核態(tài)線(xiàn)程與用戶(hù)態(tài)線(xiàn)程 273 18.2.2 輕量級(jí)的協(xié)程 274 18.2.3 改造后的 Go 語(yǔ)言協(xié)程 275 18.2.4 簡(jiǎn)說(shuō) Go 語(yǔ)言協(xié)程的調(diào)度 275 18.2.5 協(xié)作式與搶占式調(diào)度器 277 18.2.6 協(xié)程與 I/O 多路復(fù)用 277 18.3 GPM 調(diào)度流程 278 18.3.1 GPM 調(diào)度模型 278 18.3.2 G 的調(diào)度 280 18.3.3 P 的調(diào)度 282 18.3.4 M 的調(diào)度 285 18.3.5 探索調(diào)度器的調(diào)度流程 286 18.3.6 循環(huán)調(diào)度 290 18.3.7 任務(wù)執(zhí)行函數(shù) execute 294 18.4 監(jiān)控線(xiàn)程 sysmon 297 18.5 main 函數(shù)與協(xié)程的執(zhí)行順序 299 18.6 可視化分析 GPM 調(diào)度 300 18.6.1 使用 trace 分析GPM 調(diào)度 300 18.6.2 使用 GODEBUG調(diào)試 GPM 調(diào)度 302 18.7 深入探索通道 303 18.7.1 通道的底層數(shù)據(jù)結(jié)構(gòu)hchan 303 18.7.2 發(fā)生阻塞的條件 304 18.7.3 select 多路復(fù)用的底層邏輯 305 第 19 章 內(nèi)存管理 307 19.1 runtime 307 19.2 內(nèi)存分配模型 307 19.2.1 內(nèi)存模型 308 19.2.2 內(nèi)存分配過(guò)程 308 19.2.3 span 與預(yù)設(shè)的內(nèi)存大小和規(guī)格 309 19.3 內(nèi)存管理單元 310 19.3.1 mspan 311 19.3.2 mheap 312 19.3.3 heapArena 313 19.3.4 mcentral 313 19.3.5 mcache 315 19.3.6 內(nèi)存的多級(jí)分配管理 316 19.4 對(duì)象分類(lèi)及分配策略 317 19.4.1 微小對(duì)象 317 19.4.2 小對(duì)象和大對(duì)象 318 19.5 堆內(nèi)存分配總結(jié) 318 第 20 章 垃圾回收 319 20.1 垃圾回收算法 320 20.2 Go 語(yǔ)言的垃圾回收算法 321 20.2.1 標(biāo)記清掃算法 322 20.2.2 三色標(biāo)記法 323 20.2.3 三色標(biāo)記與并發(fā)問(wèn)題 325 20.2.4 三色不變式與屏障技術(shù) 326 20.2.5 插入寫(xiě)屏障 327 20.2.6 刪除寫(xiě)屏障 330 20.2.7 混合寫(xiě)屏障 333 20.2.8 并發(fā)增量式垃圾回收 334 20.3 觸發(fā)垃圾回收的時(shí)機(jī) 334 20.4 查看運(yùn)行時(shí)的垃圾回收信息 335 20.5 垃圾回收優(yōu)化示例 337 20.5.1 傳遞復(fù)雜對(duì)象時(shí)建議使用指針 337 20.5.2 自動(dòng)擴(kuò)容的代價(jià) 339 第 21 章 使用標(biāo)準(zhǔn)庫(kù)和第三方庫(kù) 341 21.1 I/O 操作 342 21.1.1 io 包 342 21.1.2 os 包 343 21.1.3 bufio 包 344 21.1.4 bytes 包 345 21.1.5 ioutil 包與替換方案 346 21.1.6 讀取文件的示例 346 21.1.7 大文件讀取方案 348 21.1.8 文件的復(fù)制 350 21.1.9 斷點(diǎn)續(xù)傳 351 21.2 網(wǎng)絡(luò)操作 352 21.2.1 Socket 編程 352 21.2.2 net/http 包 355 21.2.3 與網(wǎng)絡(luò)編程相關(guān)的其他包 359 21.3 與時(shí)間有關(guān)的標(biāo)準(zhǔn)庫(kù) 359 21.3.1 時(shí)間函數(shù) 360 21.3.2 時(shí)間戳 360 21.3.3 時(shí)間的格式化與解析 361 21.4 隨機(jī)數(shù) 362 21.5 正則表達(dá)式 362 21.6 flag 包的使用 363 21.6.1 簡(jiǎn)單標(biāo)記的聲明方式 363 21.6.2 其他使用方式 364 21.7 os 包的使用 365 21.8 crypto 包 367 21.9 base64 編碼 367 21.10 fmt 包 368 21.11 使用第三方庫(kù) 369 第 22 章 性能問(wèn)題分析與追蹤 370 22.1 性能優(yōu)化概述 370 22.2 性能優(yōu)化的步驟 371 22.3 硬件與軟件的性能指標(biāo) 373 22.4 優(yōu)化工具概述 374 22.4.1 runtime.MemStats 374 22.4.2 Benchmark 374 22.4.3 go tool pprof 工具 375 22.4.4 runtime/pprof 包 375 22.4.5 net/http/pprof 包 376 22.4.6 go tool trace 工具 377 22.4.7 fgprof 包 377 22.4.8 coredump 377 22.4.9 gcflags 379 22.4.10 GODEBUG 379 22.4.11 使用場(chǎng)景總結(jié) 380 22.5 性能優(yōu)化總結(jié) 380 22.6 使用 go tool pprof 工具進(jìn)行性能分析的示例 380 22.7 pprof 包結(jié)合 HTTP 服務(wù)使用的示例 387 22.8 pprof 包和 fgprof 包的使用對(duì)比 390 22.9 go tool trace 工具的使用示例 391 22.10 持續(xù)性能分析 392 22.11 性能問(wèn)題的定位及處理建議 393 22.11.1 CPU 占用率高的定位及處理建議 393 22.11.2 內(nèi)存使用率高的定位及處理建議 394 22.11.3 I/O 高的定位及處理建議 395 22.11.4 阻塞問(wèn)題的定位及處理建議 395 22.11.5 協(xié)程泄露的定位及處理建議 396 第 23 章 重構(gòu)“hello world” 397 23.1 搭建業(yè)務(wù)處理框架 397 23.2 設(shè)計(jì)解耦的讀寫(xiě)接口 398 23.2.1 用結(jié)構(gòu)體代替讀寫(xiě)方法 398 23.2.2 使用組合接口 399 23.3 業(yè)務(wù)實(shí)現(xiàn) 401 23.3.1 讀日志數(shù)據(jù) 401 23.3.2 Nginx 日志數(shù)據(jù)的說(shuō)明及處理 402 23.3.3 處理日志數(shù)據(jù)的關(guān)鍵代碼 403 23.3.4 實(shí)現(xiàn)數(shù)據(jù)歸檔 404 23.4 構(gòu)建 HTTP 服務(wù)發(fā)布數(shù)據(jù) 405 23.4.1 埋點(diǎn)處理 405 23.4.2 構(gòu)建 HTTP 服務(wù)發(fā)布數(shù)據(jù)的步驟 406 23.5 整合 Prometheus 發(fā)布數(shù)據(jù) 408 23.5.1 引用第三方prometheus 包 408 23.5.2 實(shí)現(xiàn)自定義的exporter 409 23.6 代碼細(xì)節(jié)的提升 412 23.7 總結(jié) 412
你還可能感興趣
我要評(píng)論
|