Сайт работает в тестовом режиме - все замечания, предложения и информацию о найденных ошибках направляйте, пожалуйста, в Telegram-группу
Курс в процессе наполнения. Полный курс доступен на Степике

Баг: Игнорирование переполнения при использовании сокращённых операторов

Новичок думает, что сокращённая запись как-то защищает от переполнения.

var t int8 = 100
t += 30
fmt.Println(t) // -126, а не 130

Почему?
Сокращённый оператор - это всего лишь синтаксический сахар. Он выполняет обычное арифметическое действие, и если результат выходит за пределы типа, происходит переполнение (для целых). Go не выдаёт ошибку, просто результат "заворачивается" по модулю.

Как избежать:
Проверяйте границы перед операцией:

var t int8 = 100
if t > math.MaxInt8 - 30 {
    // будет переполнение, обработать
} else {
    t += 30
}

Для беззнаковых типов аналогично.

Загрузка...