Uber Go 語言程式設計規範 錯誤型別

2021-10-21 11:14:21 字數 1376 閱讀 4002

在golang中有多種宣告錯誤的方式:

當返回錯誤時,請考慮以下內容以確定最佳選擇:

如果客戶端需要檢測錯誤,並且您已經使用errors.new建立了乙個簡單的錯誤,請使用var定義有乙個錯誤變數。

bad

// package foo

//直接返回乙個error

func open() error

// package bar

func use() else

}}

good

// package foo

//在foo包中,定義乙個errcouldnotopen 變數,並且此變數是可以匯出的(首字母大寫)

var errcouldnotopen = errors.new("could not open")

func open() error

// package bar

//在bar包中,

if err := foo.open(); err != nil else

}

bad

func open(file string) error 

func use() else

}}

good

//自定義乙個錯誤型別

type errnotfound struct

//實現error()方法

func (e errnotfound) error() string

//直接返回自定義的錯誤型別,並且實時修改錯誤內容

func open(file string) error

}func use() else

}}

在直接匯出自定義錯誤型別時要小心,因為它們已成為包的公共api的一部分。穩妥的辦法是是公開匹配器函式,來鑑別錯誤型別。

// package foo

//在 foo 包中,自定義錯誤型別

type errnotfound struct

//實現error()方法

func (e errnotfound) error() string

//型別斷言

func isnotfounderror(err error) bool

//返回錯誤

func open(file string) error

}// package bar

// 在 bar 包中,呼叫foo包中匯出的方法

if err := foo.open("foo"); err != nil else

}

Uber Go 語言程式設計規範 Linting

我們建議至少使用以下的linters 因為我們認為它們有助於發現最常見的問題,並且在沒有不必要的規定的情況下為 質量建立乙個高標準 我們推薦 golangci lint 作為go 的首選lint執行器,主要是因為它在大型 庫中的效能以及同時配置和使用多個規範lint的能力。這個repo 有個例子.g...

Uber Go 語言程式設計規範 使用time處理時間

時間處理是很複雜的。關於時間的錯誤的假設通常包括以下幾個方面 一天有 24 小時 一小時有 60 分鐘 一周有七天 一年 365 天 還有更多 例如,1表示在乙個時間點上加上24小時,並不總能產生乙個新的日曆日期。因此,在處理時間時,始終使用 time 包,因為它有助於以更安全 更精確的方式處理這些...

Uber Go 語言程式設計規範 初始化 Maps

對於空的 maps,請使用make 初始化,並且以程式設計的方式填充的。這使得map的初始化在表現上不同於宣告,並且可以方便地在以後新增容量大小提示 如果有的話 badvar m1 可以安全的讀寫 m2 在寫時會panic m1 map t1 t2 m2 map t1 t2 宣告和初始化看起來非常相...