Выбор ответа Middle Строки, байты и руны спрашивают часто обновлено
Склейка строк в цикле
Вопрос
Нужно склеить 100 000 строк. Какой способ эффективнее всего?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: strings.Builder с WriteString и Grow. += в цикле каждый раз копирует всё накопленное, это O(n²) по памяти и времени, и компилятор цикл так не оптимизирует.
Варианты ответа
strings.BuilderсWriteStringиGrowправильный ответs += partв цикле: компилятор сам заведёт буферfmt.Sprintf("%s%s", s, part)в цикле, без копий- Собрать в
[]stringи сложить через+в конце
Разбор
+= в цикле каждый раз копирует всё накопленное, это O(n²) по памяти и времени, и компилятор цикл так не оптимизирует. Sprintf ещё хуже: та же копия плюс разбор формата. strings.Builder дописывает в растущий буфер, а String() отдаёт его без копирования. Для готового слайса подходит strings.Join, он тоже считает общий размер заранее.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Строки, байты и руны»
- Байты и символы в строке Go
- Разворот строки с кириллицей на Go
- Сжатие RLE для строк UTF-8 на Go
- Палиндром с кириллицей и знаками на Go
- Перенос текста по ширине в символах на Go
- Что выведет Go: len и range по строке с кириллицей
- Что выведет Go: руны, байты и преобразования
- Что выведет Go: сравнение и срезы строк