Выбор ответа Middle Строки, байты и руны спрашивают часто обновлено

Склейка строк в цикле

Вопрос

Нужно склеить 100 000 строк. Какой способ эффективнее всего?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: strings.Builder с WriteString и Grow. += в цикле каждый раз копирует всё накопленное, это O(n²) по памяти и времени, и компилятор цикл так не оптимизирует.

Варианты ответа

  1. strings.Builder с WriteString и Growправильный ответ
  2. s += part в цикле: компилятор сам заведёт буфер
  3. fmt.Sprintf("%s%s", s, part) в цикле, без копий
  4. Собрать в []string и сложить через + в конце

Разбор

+= в цикле каждый раз копирует всё накопленное, это O(n²) по памяти и времени, и компилятор цикл так не оптимизирует. Sprintf ещё хуже: та же копия плюс разбор формата. strings.Builder дописывает в растущий буфер, а String() отдаёт его без копирования. Для готового слайса подходит strings.Join, он тоже считает общий размер заранее.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.