golang 基礎的語法特性基本已經學完了,這幾天我一直在思考下一步的學習方向跟計劃。有很多方向可以選擇比如:可以學習 web 程式設計、網路程式設計,往應用方向學習等待。可是我思前想後還是覺得應用固然很重要,但是紮實的基礎對於一個學習者來說更為重要!
最後確定了:分析標準庫的原始碼。go 一共有 150+ 的包,這是一場長期攻堅戰。
概述
為什麼選擇分析原始碼包?
- 標準庫是 go 的核心。
- 標準庫的使用是必修課,既然要學為何不直接知其所以然。
- 站在巨人的肩膀上,「學得多看得遠」。
我認為通過標準庫原始碼的分析可以收穫:
- 標準庫的使用。
- 標準庫的底層實現。
- 學習大神的編碼哲學。
- 極大的提高編碼能力和水平。
- 英文水平「原始碼註釋都是英文的」。
- 程式碼分析能力。
能看懂核心裡面的程式碼就是最大的幸福,更不用說修改裡面的程式碼了。
到現在發現 golang 真的很簡潔。他的關鍵字很少,只有 25 個,如下:
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
如何分析
整體將按照如下思路進行
- 整理出所有的包以及每個包大概的用途
- 以圍繞
fmt
包展開。 - 首先展開
fmt
。 包的依賴,然後對依賴進行逐一分析「類似於執行 fmt 包的載入過程一樣」。
如何對包進行分析?
- 翻譯註釋
- 解讀原始碼分析邏輯
- 思考與練習包的使用
- 如果可以自己嘗試實現包
- 總結
所有 Package 的集合
下面先大概列出所有的包以及它們的作用「有一些包的介紹來自《 Go 入門教程 》」
archive/tar
和/zip-compress
:壓縮(解壓縮)檔案功能。fmt
-io
-bufio
-path/filepath
-flag
:fmt
: 提供了格式化輸入輸出功能。io
: 提供了基本輸入輸出功能,大多數是圍繞系統功能的封裝。bufio
: 緩衝輸入輸出功能的封裝。path/filepath
: 用來操作在當前系統中的目標檔名路徑。flag
: 對命令列引數的操作。
strings
-strconv
-unicode
-regexp
-bytes
:strings
: 提供對字串的操作。strconv
: 提供將字串轉換為基礎型別的功能。unicode
: 為 unicode 型的字串提供特殊的功能。regexp
: 正規表示式功能。bytes
: 提供對字元型分片的操作。index/suffixarray
: 子字串快速查詢。
math
-math/cmath
-math/big
-math/rand
-sort
:math
: 基本的數學函式。math/cmath
: 對複數的操作。math/rand
: 偽隨機數生成。sort
: 為陣列排序和自定義集合。math/big
: 大數的實現和計算。
container
-/list-ring-heap
: 實現對集合的操作。list
: 雙連結串列。ring
: 環形連結串列。
builtin
: 描述了允許 godoc 提供語言識別符號的文件。compress/bzip2
/flate
/gzip
/lzw
zlib
compress/bzip2
:實現了 bzip2 的解壓縮。flate
:實現了 DEFLATE 的資料壓縮格式,如 RFC 1951 中所述。gzip
:實現了 gzip 格式壓縮檔案的讀寫。lzw
:實現了Lempel-Ziv-Welch壓縮資料格式。zlib
:實現了 zlib 資料壓縮格式的讀寫。
context
:定義了 Context 型別,它跨 API 邊界和程式之間攜帶截止日期,取消訊號和其他請求範圍的值。crypto
crypto/md5
crypto
: 常見的加密常量的集合crypto/md5
: md5 加密crypto/sha1
: sha1 加密
errors
: 實現了操作錯誤的方法expvar
: 為通用變數提供標準化介面。hash
: 所有雜湊函式實現的通用介面。html
: HTML 文字進行轉碼和轉義的功能.image
、/color
、/draw
、/gif
/jpeg
png
image
: 實現基本的二維圖形庫.image/color
: 顏色基本庫image/draw
:提供影象合成功能image/gif
:gif 影象解碼器和編碼器image/jpeg
:image/png
:
sort
: 提供了用於排序切片和使用者定義集合的原函式.unsafe
: 包含了一些打破 Go 語言“型別安全”的命令,一般的程式中不會被使用,可用在 C/C++ 程式的呼叫中。syscall
-os
-os/exec
:os
: 提供給我們一個平臺無關性的作業系統功能介面,採用類Unix設計,隱藏了不同作業系統間差異,讓不同的檔案系統和作業系統物件表現一致。os/exec
: 提供我們執行外部作業系統命令和程式的方式。syscall
: 底層的外部包,提供了作業系統底層呼叫的基本介面。
time
-log
:time
: 日期和時間的基本操作。log
: 記錄程式執行時產生的日誌,我們將在後面的章節使用它。
encoding/json
-encoding/xml
-text/template
:encoding/json
: 讀取並解碼和寫入並編碼 JSON 資料。encoding/xml
:簡單的 XML1.0 解析器。text/template
:生成像 HTML 一樣的資料與文字混合的資料驅動。
net
-net/http
:net
: 網路資料的基本操作。http
: 提供了一個可擴充套件的 HTTP 伺服器和基礎客戶端,解析 HTTP 請求和回覆。
runtime
: Go 程式執行時的互動操作,例如垃圾回收和協程建立。reflect
: 實現通過程式執行時反射,讓程式操作任意型別的變數。sql
: 為資料庫提供圍繞 SQL (或類 SQL) 的通用介面。
整列表可以在 Go Walker 檢視。
總結
Go 的包還是挺多的,其實分析原始碼本身就是一件不容易的事,這時第一步,接下來要堅持下來。以此來驅動我提高編碼能力跟程式碼質量以及英語水平。
最後重要的事情:如有不對或者錯誤的地方歡迎大家指正,或者意見建議。『初出茅廬、歡迎指點』