Вопрос проверяет понимание внутреннего устройства strings.Builder в Go и причин его эффективности по сравнению с конкатенацией строк.
strings.Builder в Go — это структура, которая содержит внутренний срез байтов ([]byte). Когда вы вызываете метод WriteString, данные копируются в этот срез. Если срез заполнен, он автоматически расширяется (обычно удваивается), что минимизирует количество выделений памяти.
При наивной конкатенации строк через оператор + каждая операция создает новую строку, копируя содержимое обеих строк. Это приводит к множественным выделениям памяти и копированиям, особенно в цикле. Например:
s := ""
for i := 0; i < 1000; i++ {
s += "a" // каждая итерация создает новую строку
}Этот код создает 1000 новых строк, каждая из которых копирует все предыдущие данные. С strings.Builder:
var sb strings.Builder
for i := 0; i < 1000; i++ {
sb.WriteString("a")
}
s := sb.String()Здесь данные накапливаются в буфере, и только в конце создается одна строка. Это значительно снижает количество аллокаций и копирований.
strings.Builder идеален для построения больших строк, например, при формировании SQL-запросов, HTML-шаблонов или логов. Он также безопасен для конкурентного использования (если не вызывать методы из разных горутин без синхронизации).
Вывод: Используйте strings.Builder, когда нужно многократно добавлять данные к строке, особенно в циклах. Это улучшает производительность и снижает нагрузку на сборщик мусора.