Es bueno que Go tenga un Duration
tipo: tener unidades definidas explícitamente puede prevenir problemas del mundo real.
Y debido a las estrictas reglas de tipo de Go, no puedes multiplicar una Duración por un entero; debes usar un yeso para multiplicar los tipos comunes.
/*
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 documentación oficial demuestra el uso del método 1:
Para convertir un número entero de unidades a una Duración, multiplique:
seconds := 10
fmt.Print(time.Duration(seconds)*time.Second) // prints 10s
Pero, por supuesto, multiplicar una duración por una duración no debería producir una duración, eso no tiene sentido a primera vista. Caso en cuestión, produce 5 milisegundos por 5 milisegundos 6h56m40s
. Intentar cuadrar 5 segundos resulta en un desbordamiento (y ni siquiera se compilará si se hace con constantes).
Por cierto, la int64
representación Duration
en nanosegundos "limita la mayor duración representable a aproximadamente 290 años" , y esto indica que Duration
, como int64
, se trata como un valor con signo: (1<<(64-1))/(1e9*60*60*24*365.25) ~= 292
y así es exactamente como se implementa:
// 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
Entonces, porque sabemos que la representación subyacente de Duration
es un int64
, realizando el reparto entre int64
yDuration
es un NO-OP sensible, requerido solo para satisfacer las reglas del lenguaje sobre la mezcla de tipos, y no tiene ningún efecto en la operación de multiplicación posterior.
Si no le gusta el casting por razones de pureza, entiérrelo en una llamada a la función como he mostrado anteriormente.
rand.Seed(time.Now().Unix())