Я сделал https://www.npmjs.com/package/jsx-control-statements , чтобы сделать его немного легче, в основном это позволяет вам определить условные обозначения
как теги, а затем компилирует их в trernary ifs, чтобы код внутри
выполнялся только в том случае, если условие истинно.
Ваша проблема здесь:
result := int64((now-1)/blockInterval) * blockInterval
time.Now().Unix()
возвращает текущее время Unix в секундах . Таким образом, для последовательных итераций time.Now().Unix()
будет:
1257894001
1257894002
1257894003
Но в вашей функции вы вычитаете 1, а затем делите на десять, поэтому каждое из вышеперечисленных становится следующим, поскольку дробная часть отбрасывается .
125789400
125789400
125789400
Затем, когда вы умножаете на blockInterval
(10), все они становятся:
1257894000
1257894000
1257894000
Таким образом, result
заканчивается тем же. Если вы позволите ему работать дольше десяти секунд, вы увидите, что result
изменится через 10 секунд:
На самом деле,
int64((now - 1)/blockInterval * blockInterval
не возвращает один и тот же результат все время. Вы заметите, что он меняется каждые 10 секунд.
Это вызвано целочисленным делением в Go. Если вы применяете целочисленное деление к любым двум числам, то дробная часть результата (остаток) отбрасывается. Например, int(12 / 10) = 1
. В вашем конкретном случае - при делении на десять код сбрасывает остатки с 1 до 9 и увеличивает значение только тогда, когда вы переходите к следующим 10.
Если вы хотите повысить точность своих операций, то можете принудительно разделить числа с плавающей точкой следующим образом float64(12)/float64(10)
.