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

2021-10-25 17:29:29 字數 2012 閱讀 3330

時間處理是很複雜的。關於時間的錯誤的假設通常包括以下幾個方面:

一天有 24 小時

一小時有 60 分鐘

一周有七天

一年 365 天

還有更多

例如,1表示在乙個時間點上加上24小時,並不總能產生乙個新的日曆日期。

因此, 在處理時間時,始終使用"time"包,因為它有助於以更安全、更精確的方式處理這些錯誤的假設。

使用time.time表達瞬時時間

處理瞬時時間時請使用time.time,在比較、新增和減少時間時使用time.time中的方法。

bad

func isactive(now, start, stop int) bool
good

func isactive(now, start, stop time.time) bool
使用 time.duration處理間隔時間

在處理間隔時間(時間段)時使用time.duration.

bad

func poll(delay int) 

}poll(10) // 引數代表的是幾秒鐘還是幾毫秒?

good

//代表了時間段

func poll(delay time.duration)

}poll(10*time.second) //可以看出是10秒鐘

回到前面的例子,給乙個時間點瞬時加上24小時,我們用於新增時間的方法取決於要達到的目的:如果我們想要下乙個日曆日(當前天的下一天)的同乙個時間點,我們應該使用time.adddate.方法。如果我們想保證某一時刻比前一時刻晚 24 小時,我們應該使用time.add。

newday := t.adddate(0 /* years */, 0 /* months */, 1 /* days */)

maybenewday := t.add(24 * time.hour)

對外部系統使用time.time和time.duration

盡可能在與外部系統的互動中,使用time.durationtime.time. 例如 :

當不能在這些互動中使用time.duration,請使用intfloat64,並且要在欄位名稱中包含時間單位。

例如encoding/json不支援time.duration,時間單位則包含在了欄位名稱中。

bad

// 

type config struct

good

// 

type config struct

如果當在這些互動中不能使用time.time時,除非替代方法達成一致了,否則使用string和 rfc 3339 中定義的格式時間戳。預設情況下,time.unmarshaltext使用此格式,並可通過time.rfc3339time.formattime.parse中使用。

儘管這在實踐中並不成問題,但請記住,"time"包不支援解析閏秒時間戳(8728),也不在計算中考慮閏秒(15190)。如果您比較兩個時間瞬間,則差異將不包括這兩個瞬間之間可能發生的閏秒。

Uber Go 語言程式設計規範 Linting

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

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

在golang中有多種宣告錯誤的方式 當返回錯誤時,請考慮以下內容以確定最佳選擇 如果客戶端需要檢測錯誤,並且您已經使用errors.new建立了乙個簡單的錯誤,請使用var定義有乙個錯誤變數。bad package foo 直接返回乙個error func open error package b...

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

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