Ответ
В Go есть несколько способов конкатенации строк, каждый из которых имеет свои особенности производительности и удобства использования:
- Оператор
+
(простой, но неэффективный для множества строк в цикле, так как каждая операция создает новую строку и требует новой аллокации памяти):
s := "Hello" + " " + "World"
fmt.Println(s) // Output: Hello World
fmt.Sprintf()
(удобен для форматирования строк с переменными, но может быть менее производительным, чемstrings.Builder
для чистой конкатенации):
name := "World"
s := fmt.Sprintf("Hello %s", name)
fmt.Println(s) // Output: Hello World
strings.Join()
(оптимален для конкатенации элементов слайса строк с заданным разделителем. Эффективен, так как заранее вычисляет необходимый размер буфера):
parts := []string{"Hello", "World"}
s := strings.Join(parts, " ")
fmt.Println(s) // Output: Hello World
strings.Builder
(самый эффективный способ для построения строк из множества частей, особенно в циклах. Минимизирует аллокации памяти, используя внутренний буфер, который расширяется по мере необходимости):
var b strings.Builder
b.WriteString("Hello")
b.WriteString(" ")
b.WriteString("World")
s := b.String()
fmt.Println(s) // Output: Hello World
bytes.Buffer
(аналогичноstrings.Builder
, но работает с байтовыми срезами ([]byte
). Может быть использован для конкатенации строк, но требует преобразования строк в байты. Чаще используется для построения бинарных данных или когда требуется более низкоуровневый контроль или работа с байтами. Для чистой конкатенации строкstrings.Builder
обычно предпочтительнее из-за оптимизаций, специфичных для строк):
var buf bytes.Buffer
buf.WriteString("Hello")
buf.WriteString(" ")
buf.WriteString("World")
s := buf.String()
fmt.Println(s) // Output: Hello World
Для частых конкатенаций в циклах или при работе с большим количеством строковых фрагментов предпочтительнее использовать strings.Builder
или bytes.Buffer
, так как они минимизируют аллокации памяти и обеспечивают лучшую производительность по сравнению с оператором +
или fmt.Sprintf()
.