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