2 回答

TA貢獻1795條經驗 獲得超7個贊
數字運算的操作數必須具有相同的類型。將值轉換為int
:idx
time.Duration
var a = time.Duration(idx) * time.Minute

TA貢獻1856條經驗 獲得超5個贊
作為其他編程語言的開發人員,我發現這是最違反直覺和不合邏輯的做法。在過去的 10 年里,我在 Scala 工作過,它可以像這樣簡單:
val a = idx minutes
相比之下,Go 方式:
var a = time.Duration(idx) * time.Minute
更冗長,但這不會是世界末日。
問題在于,如果您想要獲得另一個 Duration 作為結果,則將 Duration 與另一個 Duration 相乘沒有任何意義,因為從物理角度來看,這將以秒的平方來衡量。
根據文檔 time.Minute 是一個常數:
const (
Nanosecond Duration = 1
Microsecond = 1000 * Nanosecond
Millisecond = 1000 * Microsecond
Second = 1000 * Millisecond
Minute = 60 * Second
Hour = 60 * Minute
)
所有這些都是根據 Duration 類型定義的,它是 int64 的別名:
type Duration int64
據我所知,將整數文字與這些常量中的每一個相乘是非常好的,畢竟這就是每個常量相對于其他常量的定義方式。
因此,回顧一下為什么60 * time.Second語法是有效的(并且非常有意義),但是:
var secondsInAMinute := 60
var oneMinute = secondsInAMinute * time.Second
是無效的。這沒有任何意義。
所有這些常量都是 Duration 類型。這意味著它們是以時間為單位測量的(準確地說是一納秒的倍數)。
因此,似乎“正確”的方法(在編譯和工作的意義上是正確的)沒有任何物理意義。讓我們再看看這個:
var a = time.Duration(idx) * time.Minute
因此,我們將 time.Duration(idx) 與 time.Minute 相乘。
的類型time.Minute是 Duration ,應該用時間單位來衡量。在物理學中,公認的時間單位是秒。似乎 Go 使用整數納秒代替,所以 time.Minute 表示持續時間,在內部以納秒表示。沒關系。
問題在于它time.Duration(idx)還將整數 idx“轉換”為持續時間,因此在物理學中它也將表示為時間單位,如秒。因此,相應地,我認為 time.Duration(idx)idx nanoseconds在 Go 中代表。
所以,基本上,當我們寫的時候,time.Duration(idx) * time.Minute我們是將idx nanoseconds(idx * 0.0000000001 秒) 與one minute(60 秒) 相乘。
所以,從物理的角度來看time.Duration(idx) * time.Minute將代表idx * 0.000000001 seconds * 60 seconds. 或者,簡化,idx * 0.00000006 seconds squared.
現在,在哪個世界idx * 0.00000006 seconds squared等于idx * 1 minute?
所以,現在我知道,在 Go 中,如果你想對一個持續時間應用一個乘數,你必須將該持續時間乘以另一個持續時間,然后在你的腦海中將它除以這樣所有這些混亂仍然可以具有任何物理one millisecond意義.
我知道所有這些單位不一致都是“數字運算的操作數必須具有相同類型”的結果。約束。但這并不能使它更合乎邏輯或不那么煩人。在我看來,應該取消對 Go 語言的限制。
但是,對于任何在我的解釋中迷失的人,讓我們通過一個具體的代碼示例看看這一切是多么不合邏輯:
package main
import (
"fmt"
"time"
)
func main() {
var oneMinute = 1 * time.Minute
var oneNanosecond = 1 * time.Nanosecond
var oneMinuteTimesOneNanoSecond = oneMinute * oneNanosecond
fmt.Println(oneMinuteTimesOneNanoSecond)
}
結果正是我對這種荒謬的時間計算方式的預期:
1m0s
我會學會忍受這個,但我永遠不會喜歡它。
- 2 回答
- 0 關注
- 215 瀏覽
添加回答
舉報