É bom que o Go tenha um Duration
tipo - ter unidades explicitamente definidas pode evitar problemas do mundo real.
E, devido às regras estritas de Go, você não pode multiplicar uma Duração por um número inteiro - você deve usar uma conversão para multiplicar tipos comuns.
/*
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'
}
A documentação oficial demonstra o uso do método 1:
Para converter um número inteiro de unidades em uma duração, multiplique:
seconds := 10
fmt.Print(time.Duration(seconds)*time.Second) // prints 10s
Mas, é claro, multiplicar uma duração por uma duração não deve produzir uma duração - isso não faz sentido. Caso em questão, 5 milissegundos vezes 5 milissegundos produz 6h56m40s
. Tentar quadrado 5 segundos resulta em um estouro (e nem será compilado se for feito com constantes).
A propósito, a int64
representação Duration
em nanossegundos "limita a maior duração representável a aproximadamente 290 anos" , e isso indica que Duration
, assim int64
, é tratado como um valor assinado: (1<<(64-1))/(1e9*60*60*24*365.25) ~= 292
e é exatamente assim que é implementado:
// 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
Portanto, porque sabemos que a representação subjacente de Duration
é um int64
, executando o elenco entre int64
e Duration
é um NO-OP sensível - necessário apenas para satisfazer as regras de linguagem sobre tipos de mistura, e não tem efeito na operação de multiplicação subsequente.
Se você não gostar do elenco por razões de pureza, enterre-o em uma chamada de função, como mostrei acima.
rand.Seed(time.Now().Unix())