Назад к задачам
Холодильник.руПолучайте помощь с лайвкодингом в реальном времени с Sobes Copilot
Junior — Senior
5
Эффективное формирование строки в цикле
Компании, где спрашивали:
Условие задачи
В данном примере рассматриваются типичные проблемы при построении строки в цикле и способы их устранения.
func fn() {
result := ""
for i := 0; i < 100000; i++ {
result += fmt.Sprintf("%d", i)
}
}
Проблемы:
- Операция
result += …каждый раз создает новую строку, копируя содержимое, что приводит к O(n²) времени и большому расходу памяти. - Внутри цикла используется
fmt.Sprintf, который тоже дорогой, так как формирует строку через форматирование.
Рекомендации по улучшению:
- Использовать
strings.Builder(илиbytes.Buffer) – он умеет аккумулировать байты без повторного копирования. - Преобразовывать число в строку без
Sprintf, например черезstrconv.Itoa.
func fn() {
var b strings.Builder
b.Grow(600000) // приблизительная оценка размера, чтобы избежать перераспределений
for i := 0; i < 100000; i++ {
b.WriteString(strconv.Itoa(i))
}
result := b.String()
_ = result // использовать дальше
}
Такой подход уменьшает время выполнения и потребление памяти до O(n).