C'est bien que Go ait un Duration
type - avoir des unités explicitement définies peut éviter des problèmes du monde réel.
Et en raison des règles de type strictes de Go, vous ne pouvez pas multiplier une durée par un entier - vous devez utiliser un cast pour multiplier les types communs.
/*
MultiplyDuration Hide semantically invalid duration math behind a function
*/
func MultiplyDuration(factor int64, d time.Duration) time.Duration {
return time.Duration(factor) * d // method 1 -- multiply in 'Duration'
// return time.Duration(factor * int64(d)) // method 2 -- multiply in 'int64'
}
La documentation officielle montre l'utilisation de la méthode # 1:
Pour convertir un nombre entier d'unités en une durée, multipliez:
seconds := 10
fmt.Print(time.Duration(seconds)*time.Second) // prints 10s
Mais, bien sûr, multiplier une durée par une durée ne devrait pas produire une durée - c'est absurde à première vue. Par exemple, 5 millisecondes multipliées par 5 millisecondes 6h56m40s
. Tenter de mettre au carré 5 secondes entraîne un débordement (et ne sera même pas compilé s'il est fait avec des constantes).
Soit dit en passant, la int64
représentation Duration
en nanosecondes "limite la plus grande durée représentable à environ 290 ans" , et cela indique que Duration
, comme int64
, est traité comme une valeur signée:, (1<<(64-1))/(1e9*60*60*24*365.25) ~= 292
et c'est exactement comme cela qu'il est mis en œuvre:
// A Duration represents the elapsed time between two instants
// as an int64 nanosecond count. The representation limits the
// largest representable duration to approximately 290 years.
type Duration int64
Donc, parce que nous savons que la représentation sous-jacente de Duration
est un int64
, effectuant la conversion entre int64
et Duration
est un NO-OP sensible - requis uniquement pour satisfaire les règles de langage sur les types de mélange, et cela n'a aucun effet sur l'opération de multiplication suivante.
Si vous n'aimez pas le casting pour des raisons de pureté, enterrez-le dans un appel de fonction comme je l'ai montré ci-dessus.
rand.Seed(time.Now().Unix())