Golang Practice Advicehtml
Practical Advice for Go Library Authors by Jack Lindamood at GopherCon 2016git
www.youtube.com/watch?v=5v2…github
幻燈地址: go-talks.appspot.com/github.com/…golang
包名是未來使用過程當中的一部分,因此避免重複包名和結構與函數。好比bash
var h client.Client → var h http.Client
複製代碼
context.NewContext() => context.Background()
複製代碼
golang 沒有構造函數,所以建立對象通常有兩種辦法:微信
推薦使用默認 0 值的構造方法併發
在默認0值的狀況下,各個方法要處理好0值,好比有些東西發現是0值後,給入一個默認值。app
New() 構造函數很靈活,能夠作任何事情,所以對於代碼閱讀上不利,意味着隱藏了不少東西。ide
有些庫使用私有 struct,公開接口的方法,authImpl struct and Auth interface,這是反模式,不推薦使用。函數
不推薦使用 Singleton,雖然標準庫中大量使用了 Singleton 模式,可是 Jack 我的不喜歡這種模式。
使用高階函數做爲選項這種形式不推薦:NewSomething(WithThingA(), WithThingB())
一些日誌是直接打印到標準輸出去,這是很是很差的設計,由於用戶若是想關根本關不了。
建議
接受 interface ,但返回的是 struct
這點和 Java 不一樣,Java 更傾向於全部東西都是經過 interface 操做。而 golang 不須要,golang 使用的是隱性interface。
最好都不 panic。若是非要 panic,可能最合適的地方是 init 的時候,由於剛一運行就能看到掛了,比較容易處理。但即便如此,也儘可能不要 panic。
問:咱們是須要檢查全部的 error 麼?好比有些彷佛不大容易出錯。 答:須要,特別是你說的這些不大容易出錯的!!
咱們用 error 代替了 exception,因此不要忽略這個東西。
處理的辦法
何時應該返回錯誤比較合適?
雖然 channel 是 golang 一個處理併發很好地東西,可是並不是全部場合都須要。好比標準庫中就不多有在 API 中使用 channel 的。
我的微信公衆號:
我的github:
我的博客: