
Баг: Игнорирование переполнения при использовании сокращённых операторов
Новичок думает, что сокращённая запись как-то защищает от переполнения.
var t int8 = 100
t += 30
fmt.Println(t) // -126, а не 130Почему?
Сокращённый оператор - это всего лишь синтаксический сахар. Он выполняет обычное арифметическое действие, и если результат выходит за пределы типа, происходит переполнение (для целых). Go не выдаёт ошибку, просто результат "заворачивается" по модулю.
Как избежать:
Проверяйте границы перед операцией:
var t int8 = 100
if t > math.MaxInt8 - 30 {
// будет переполнение, обработать
} else {
t += 30
}Для беззнаковых типов аналогично.
Загрузка...