亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 for 循環中創建持續時間 -(不匹配類型 int 和 time.Duration)

如何在 for 循環中創建持續時間 -(不匹配類型 int 和 time.Duration)

Go
侃侃爾雅 2023-06-01 15:10:58
我有一個循環,我從 time.Time 開始,我要添加一分鐘。 for idx := range keys {    var a = idx * time.Minute    var t = tInit.Add(time.Minute * a)    fmt.Println(t, idx) }這是我的錯誤invalid operation: idx * time.Minute (mismatched types int and time.Duration)
查看完整描述

2 回答

?
一只萌萌小番薯

TA貢獻1795條經驗 獲得超7個贊

數字運算的操作數必須具有相同的類型。將值轉換為intidxtime.Durationvar a = time.Duration(idx) * time.Minute



查看完整回答
反對 回復 2023-06-01
?
RISEBY

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

我會學會忍受這個,但我永遠不會喜歡它。


查看完整回答
反對 回復 2023-06-01
  • 2 回答
  • 0 關注
  • 215 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號