Что нужно сделать по шагам для реализации функции преобразования числа в строку
Что проверяют
Знаете ли вы стандартную библиотеку и понимаете ли, как в Go устроены строки, байты и руны. Заодно смотрят на аккуратность в краевых значениях: ноль, отрицательное число, минимальное целое.
Как отвечать
Сначала сказать, что в рабочем коде это strconv.Itoa(n) или strconv.FormatInt(int64(n), 10). Вариант fmt.Sprintf("%d", n) тоже работает, но идёт через интерфейс и рефлексию и заметно медленнее.
Дальше разобрать задачу руками, по шагам:
- ноль отдельным случаем, иначе цикл не выполнится ни разу и вернётся пустая строка;
- знак запомнить и дальше работать с модулем числа;
- в цикле брать остаток
n % 10и делить на 10, цифру переводить в байт как'0' + d; - собирать результат в буфер и заполнять его с конца, потому что цифры извлекаются в обратном порядке.
func itoa(n int) string {
if n == 0 {
return "0"
}
neg := n < 0
u := uint64(n)
if neg {
u = -u // беззнаковое отрицание даёт модуль и для минимального int
}
buf := make([]byte, 20)
i := len(buf)
for u > 0 {
i--
buf[i] = byte('0' + u%10)
u /= 10
}
if neg {
i--
buf[i] = '-'
}
return string(buf[i:])
}Где спотыкаются
Пишут string(d) для цифры. Конверсия числа в строку в Go трактует число как код символа: string(65) даёт букву, а не текст 65. Нужен byte('0' + d) либо strconv, и go vet на такую конверсию ругается отдельно.
Складывают строку конкатенацией в цикле. Строки неизменяемы, каждая склейка выделяет новый буфер и копирует предыдущий результат, на длинном числе работа становится квадратичной. Ожидаемый ответ: срез байтов или strings.Builder с заранее заданной ёмкостью.
Роняют краевые значения. Отрицание самого маленького int переполняется и возвращает то же самое число, поэтому модуль берут в беззнаковом типе. И симметричная задача: strconv.Atoi возвращает ошибку вторым значением, игнорировать её нельзя.