golang 專注于軟件工程的實用性,學習起來不同于其他一些很 magic 的編程語言,我們要遵循標準和一些范式。
最好的資料就是 golang 的標準庫源代碼,只是有些庫本身要處理的事情比較復雜,或者需要一定的知識儲備,導致我們很難在短時間內理清脈絡深入學習。那么我們需要一些小巧精悍適合初學者的開源庫,我們可以按照這些標準找:
- 符合 golang 標準,使用地道的編程范式。
- 完善文檔和測試。
- 核心功能盡可能集中,代碼規模盡可能的小。
下面是我自己在尋覓的過程中感覺還不錯的幾個開源庫:
語法:gorilla/context
這個核心代碼只有 100 行左右的小庫,可以讓我們學習到 golang 中 map 和 sync.RWMutex 在實踐中的使用,更為重要的是,從中我們可以學習軟件工程的一些優秀實踐:注釋,測試,命名等。
HTTP:urfave/negroni
這個庫核心代碼也是 100 行左右,其功能就是為 http.Handler
添加 middleware 功能。這個庫值得學習的地方在于理解 net/http 的設計理念,看看實踐中如何用 interface 降低模塊之間的耦合度以及如何設計模塊和模塊之間的關系。
gorutine:go-playground/pool
核心代碼 150 行,主要功能是實現了一個 gorutine 的 pool,抄寫這個庫的代碼可以了解 golang 中 gorutine 的基本概念,channel 和 select 的使用方式以及如何用 sync.WaitGroup 管理 gorutine 。
實踐抄寫的過程中,可以帶著這些問題:
- 這個開源庫的邊界、對外接口或者叫核心功能是什么?
- 這個開源庫在實現的過程中考慮了那些邊界條件,如何把握效率與可用性之間的平衡點?
- 這個開源庫用到了哪些內置庫,如何使用的?
- 如果只看 README 和 go doc 輸出的對外接口,能否在不了解內部實現的情況下自己寫出來?
- 如果源碼中有些東西我不熟悉,看過源碼,理清思路后能否默寫出來?
- 完成實現后,如何寫出簡單易讀并且覆蓋完善的測試?
這是我之前練習 gorilla/context 寫的文章,大家可以參考一下我當時的思路:
Golang 學習 -- “聽寫” gorilla/context