> Нужно ли проверять и обрабатывать крайние случаи, такие как ноль и отрицательные значения при преобразовании числа в строку (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Кодинг

Компании: МайлРу

Стек: Go

> Пример ответа

Короткий ответ

Да, нужно, но характер проверки зависит от контракта функции. В Go strconv.Itoa и fmt.Sprintf корректно обрабатывают ноль и отрицательные значения без паники, поэтому отдельная валидация не требуется, если задача - просто сериализовать int. Однако если по бизнес-логике отрицательные значения или ноль недопустимы, их нужно явно отвергать до преобразования, иначе получите некорректные данные на выходе.

Подход к решению

Сначала определите контракт: функция преобразует любое целое или только валидный домен. Если любое - полагайтесь на стандартную библиотеку, она уже покрывает крайние случаи. Если домен ограничен - валидируйте до конвертации и возвращайте ошибку, а не молчаливое преобразование. Учитывайте также переполнение при парсинге и локале-зависимые форматы. Для денег и идентификаторов используйте отдельные типы и явные проверки инвариантов.

Пример кода

GO
package main
import (
"errors"
"fmt"
"strconv"
)
var ErrNonPositive = errors.New("value must be positive")
// SerializeAny безопасно сериализует любое int, включая 0 и отрицательные.
func SerializeAny(n int) string {
return strconv.Itoa(n)
}
// SerializePositive требует строго положительное значение.
func SerializePositive(n int) (string, error) {
if n <= 0 {
return "", fmt.Errorf("%w: got %d", ErrNonPositive, n)
}
return strconv.Itoa(n), nil
}
func main() {
fmt.Println(SerializeAny(0)) // "0"
fmt.Println(SerializeAny(-42)) // "-42"
s, err := SerializePositive(-1)
fmt.Println(s, err) // "" value must be positive: got -1
}

Edge cases

Ноль и отрицательные значения для int в Go не являются проблемой на уровне преобразования. Опасность возникает при парсинге: strconv.Atoi("-0") вернёт 0, а strconv.ParseUint("-1", 10, 64) вернёт ошибку. Отдельно проверяйте переполнение int64 и uint64, а также значения math.MinInt64, где -n переполняется. Для float64 учитывайте -0.0, NaN и Inf, которые форматируются неочевидно.

Как отвечать на собеседовании

Скажите, что стандартная библиотека уже корректно обрабатывает ноль и отрицательные при сериализации, поэтому дублировать проверки не нужно. Затем уточните контракт функции и покажите, что валидация нужна на уровне бизнес-правил, а не самого преобразования. Приведите пример с ParseUint и переполнением, чтобы продемонстрировать понимание edge cases. Упомяните, что ошибки лучше возвращать явно, а не логировать и продолжать.

Что проверяет интервьюер

Понимание разницы между технической корректностью преобразования и бизнес-валидацией. Знание поведения strconv и fmt для граничных значений. Умение проектировать API с явными ошибками вместо скрытых допущений. Внимание к переполнению, NaN и локали. Способность отделять ответственность сериализации от валидации домена.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью