Проверяет понимание эффективной конкатенации строк в Go без использования strings.Builder через работу с байтовыми буферами.
Строки в Go являются неизменяемыми (immutable). Каждая операция + создает новую строку, копируя содержимое обеих строк в новую область памяти. При многократной конкатенации это приводит к множеству аллокаций и нагрузке на сборщик мусора.
Пакет bytes предоставляет тип Buffer, который работает с байтовым срезом и позволяет эффективно накапливать данные без создания промежуточных строк.
package main
import (
"bytes"
"fmt"
)
func main() {
var buf bytes.Buffer
words := []string{"Hello", " ", "World", "!", " This", " is", " Go"}
for _, w := range words {
buf.WriteString(w)
}
result := buf.String()
fmt.Println(result)
}Если strings.Builder недоступен (например, в старых версиях Go), можно реализовать аналогичную логику вручную:
type StringBuilder struct {
buf []byte
}
func (sb *StringBuilder) WriteString(s string) {
sb.buf = append(sb.buf, s...)
}
func (sb *StringBuilder) String() string {
return string(sb.buf)
}
func main() {
var sb StringBuilder
sb.WriteString("Hello")
sb.WriteString(" ")
sb.WriteString("World")
fmt.Println(sb.String())
}bytes.Buffer и ручная реализация используют один растущий срез, избегая создания множества промежуточных строк.make([]byte, 0, capacity) для еще большей эффективности.Вывод: Для эффективной конкатенации строк в Go всегда используйте strings.Builder (или bytes.Buffer), а при необходимости ручной реализации — работайте напрямую с байтовым срезом через append. Это критически важно в высоконагруженных приложениях и при работе с большими объемами текстовых данных.