Приємно, що Go має Duration
тип - наявність чітко визначених одиниць може запобігти проблемам у реальному світі.
А через суворі правила правил Go, ви не можете помножити тривалість на ціле число - для множення загальних типів ви повинні використовувати команду.
/*
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'
}
Офіційна документація демонструє використання методу # 1:
Щоб перетворити ціле число одиниць у тривалість, помножте:
seconds := 10
fmt.Print(time.Duration(seconds)*time.Second) // prints 10s
Але, звичайно, множення тривалості на тривалість не повинно створювати тривалості - це безглуздо для цього. Справа в точці, 5 мілісекунд раз 5 мілісекунд 6h56m40s
. Спроба вивести квадрат на 5 секунд призводить до переповнення (і навіть не компілюється, якщо зробити це з константами).
До речі, int64
представництвоDuration
в наносекундах "обмежує найбільшу представлену тривалість приблизно до 290 років" , і це вказує на те Duration
, що , як int64
, трактується як підписане значення:, (1<<(64-1))/(1e9*60*60*24*365.25) ~= 292
і саме так воно реалізується:
// 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
Отже, оскільки ми знаємо, що основним представленням Duration
є int64
, що виконує форму між int64
і Duration
є розумним NO-OP - потрібно лише для задоволення мовних правил щодо типів змішування, і це не впливає на подальшу операцію множення.
Якщо ви не любите кастинг з чистоти, похойте його у виклику функції, як я показав вище.
rand.Seed(time.Now().Unix())