6. 開篇《 刻意學習 Golang - 標準庫原始碼分析 》

jerrkill發表於2019-03-18

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 的包還是挺多的,其實分析原始碼本身就是一件不容易的事,這時第一步,接下來要堅持下來。以此來驅動我提高編碼能力跟程式碼質量以及英語水平。

最後重要的事情:如有不對或者錯誤的地方歡迎大家指正,或者意見建議。『初出茅廬、歡迎指點』

高度自律,深度思考,以勤補拙

相關文章