Назад к задачам
Junior — Senior
5

Эффективное формирование строки в цикле

Компании, где спрашивали:

Холодильник.руХолодильник.ру
Получайте помощь с лайвкодингом в реальном времени с Sobes Copilot
Условие задачи

В данном примере рассматриваются типичные проблемы при построении строки в цикле и способы их устранения.

func fn() {
    result := ""
    for i := 0; i < 100000; i++ {
        result += fmt.Sprintf("%d", i)
    }
}

Проблемы:

  • Операция result += … каждый раз создает новую строку, копируя содержимое, что приводит к O(n²) времени и большому расходу памяти.
  • Внутри цикла используется fmt.Sprintf, который тоже дорогой, так как формирует строку через форматирование.

Рекомендации по улучшению:

  1. Использовать strings.Builder (или bytes.Buffer) – он умеет аккумулировать байты без повторного копирования.
  2. Преобразовывать число в строку без 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).