簡體   English   中英

time.Duration * time.Duration 應用了兩次

[英]time.Duration * time.Duration applied twice

假設我有:

t := 10 * time.Second // 10s, 

當 time.Second 再次應用時,幕后發生了什么?

tt := t * time.Second // -2346317h47m53.709551616s

https://play.golang.org/p/upyjGgsuVQm

time.Duration值是表示納秒數的數值。

Duration 將兩個瞬間之間的經過時間表示為 int64 納秒計數。 該表示將最大可表示持續時間限制為大約 290 年。

 type Duration int64

無論您在time.Duration值上執行什么算術運算,它們都以數字方式執行,就像在int64值上一樣。

time.Second是一個(鍵入的)常數,保存一秒內的納秒數,因此將其乘以10將得到 10 秒內的納秒數。 這“完全”適合int64數字。 正如文檔所述, int64最多可以存儲大約 290 年的納秒數。

現在,如果t在 10 秒內保持納秒數,然后將其乘以 1 秒內的納秒數,使用 64 位整數,則會溢出:

fmt.Println(math.MaxInt64)
fmt.Print(int64(10*time.Second), "*", int64(time.Second))

輸出:

9223372036854775807
10000000000*1000000000

注意t是一個變量,所以溢出是可以的。 Go 中的常量是精確值,不會溢出。 所以10 * time.Second * time.Second將是一個不適合int64的常量值,因此當您嘗試將結果分配給由int64支持的變量時會出錯。 有關詳細信息,請參閱Go 編譯器對常量表達式和其他表達式的評估是否不同

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM