> Что нужно сделать по шагам для реализации функции преобразования числа в строку (Go)

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

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

Стек: Go

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

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

Для реализации функции преобразования числа в строку в Go нужно определить сигнатуру, выбрать алгоритм, обработать знак, ноль и границы диапазона, собрать цифры в буфер, затем вернуть строку. На senior-уровне важно обсудить trade-off между strconv.Itoa, fmt.Sprintf и ручной реализацией, а также производительность и аллокации.

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

  1. Уточнить требования: тип числа, основание системы счисления, поддержка отрицательных значений, минимальное и максимальное значение.
  2. Выбрать стратегию: использовать стандартную библиотеку или писать вручную, если нужна кастомная логика.
  3. Обработать особые случаи: ноль, отрицательные числа, минимальное значение int64, переполнение при смене знака.
  4. Выделить буфер достаточного размера, чтобы избежать лишних аллокаций.
  5. Заполнять буфер цифрами с конца, получая остатки от деления на основание.
  6. Добавить знак минус, если число отрицательное.
  7. Преобразовать буфер в строку и вернуть результат.
  8. Покрыть реализацию тестами, включая граничные значения и бенчмарки.

Пример кода

GO
package main
import (
"fmt"
"math"
)
func IntToString(n int64) string {
if n == 0 {
return "0"
}
negative := n < 0
var buf [20]byte
i := len(buf)
// Работаем с отрицательным числом, чтобы избежать переполнения на math.MinInt64
if !negative {
n = -n
}
for n != 0 {
i--
buf[i] = byte('0' - n%10)
n /= 10
}
if negative {
i--
buf[i] = '-'
}
return string(buf[i:])
}
func main() {
fmt.Println(IntToString(0))
fmt.Println(IntToString(-12345))
fmt.Println(IntToString(math.MaxInt64))
fmt.Println(IntToString(math.MinInt64))
}

Edge cases

  • Ноль: возвращаем "0" без знака.
  • Отрицательные числа: добавляем '-' только если число меньше нуля.
  • math.MinInt64: нельзя просто умножить на -1, так как это переполнение, поэтому работаем в отрицательном диапазоне.
  • math.MaxInt64: буфер должен вмещать 19 цифр плюс возможный знак.
  • Нестандартное основание: нужно явно обрабатывать цифры больше 9, если основание больше 10.
  • Пустой или некорректный ввод: если функция принимает interface{}, требуется отдельная валидация.

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

Начните с уточнения требований и ограничений. Предложите простое решение через strconv.Itoa, затем обсудите, зачем может понадобиться ручная реализация. Проговорите алгоритм по шагам, отдельно выделите обработку math.MinInt64 и аллокации. Покажите, что понимаете trade-off между читаемостью, производительностью и безопасностью. В конце упомяните тесты и бенчмарки.

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

Интервьюер проверяет умение декомпозировать задачу, знание стандартной библиотеки Go, понимание целочисленного переполнения и граничных значений. Также важно, как кандидат рассуждает о производительности, аллокациях и выборе между готовым решением и ручной реализацией. На senior-уровне ожидается аккуратность в деталях и способность объяснить trade-off.

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

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