time.Duration * time.Duration применено дважды - PullRequest
0 голосов
/ 13 июля 2020

Предположим, у меня есть:

t := 10 * time.Second // 10s, 

что происходит за сценой, когда снова применяется время. Секунда?

tt := t * time.Second // -2346317h47m53.709551616s

https://play.golang.org/p/upyjGgsuVQm

1 Ответ

2 голосов
/ 13 июля 2020

A time.Duration значение - это числовое значение c, которое представляет количество наносекунд .

Длительность представляет собой время, прошедшее между двумя мгновений как количество наносекунд int64. Представление ограничивает наибольшую отображаемую продолжительность примерно до 290 лет. int64 значений.

time.Second - это (типизированная) константа, содержащая количество наносекунд в одной секунде, поэтому умножение ее на 10 даст вам количество наносекунд в 10 секунд. Это «идеально» вписывается в число int64. Как указано в документации, int64 может хранить количество наносекунд примерно до 290 лет.

Теперь, если t содержит количество наносекунд в 10 секундах, и вы умножаете это на количество наносекунд в 1 секунду , используя 64-битные целые числа, которые будут переполняться:

fmt.Println(math.MaxInt64)
fmt.Print(int64(10*time.Second), "*", int64(time.Second))

Выводы:

9223372036854775807
10000000000*1000000000

Обратите внимание, что t - это переменная, поэтому переполнение допустимо. Константы в Go являются точными значениями и не переполняются. Таким образом, 10 * time.Second * time.Second будет постоянным значением, которое не вписывается в int64 и, следовательно, выдает ошибку, когда вы пытаетесь присвоить результат переменной, поддерживаемой int64. Подробнее см. Отличается ли оценка Go компилятора для константного выражения и другого выражения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...