Тип strings.Builder
Тип strings.Builder используется для эффективного построения строк
путем добавления фрагментов. В отличие от конкатенации с помощью оператора +,
которая создает новую строку при каждом объединении, Builder накапливает
данные во внутреннем буфере и преобразует их в строку только один раз -
при вызове метода String. Основные методы типа - это WriteString
для добавления строки и String для получения итоговой строки.
Создание и базовое использование
package main
import (
"fmt"
"strings"
)
func main() {
var builder strings.Builder
builder.WriteString("Hello, ")
builder.WriteString("World!")
res := builder.String()
fmt.Println(res)
}
Результат выполнения кода:
"Hello, World!"
Метод WriteString
Метод WriteString добавляет переданную строку в буфер
strings.Builder. Он возвращает количество добавленных байтов
и возможную ошибку (всегда nil при работе со строкой).
Рассмотрим пример накопления нескольких строк:
package main
import (
"fmt"
"strings"
)
func main() {
var builder strings.Builder
for i := 0; i < 3; i++ {
builder.WriteString("line ")
}
res := builder.String()
fmt.Println(res)
}
Результат выполнения кода:
"line line line "
Метод String
Метод String возвращает собранную строку на основе содержимого
внутреннего буфера. После вызова этого метода новые добавления не влияют
на ранее полученную строку, поскольку она является копией данных:
package main
import (
"fmt"
"strings"
)
func main() {
var builder strings.Builder
builder.WriteString("first")
res1 := builder.String()
builder.WriteString("second")
res2 := builder.String()
fmt.Println(res1, res2)
}
Результат выполнения кода:
"first" "firstsecond"
Предварительное выделение памяти
Для повышения производительности можно предварительно выделить память
под будущую строку с помощью метода Grow. Это позволяет избежать
многократного перераспределения памяти при добавлении большого количества
фрагментов. Рассмотрим пример:
package main
import (
"fmt"
"strings"
)
func main() {
var builder strings.Builder
builder.Grow(20) // выделяем место под 20 байт
builder.WriteString("hello")
builder.WriteString("world")
res := builder.String()
fmt.Println(res)
}
Результат выполнения кода:
"helloworld"
Сброс буфера
Метод Reset очищает внутренний буфер strings.Builder,
делая его пустым и готовым к повторному использованию:
package main
import (
"fmt"
"strings"
)
func main() {
var builder strings.Builder
builder.WriteString("old")
builder.Reset()
builder.WriteString("new")
res := builder.String()
fmt.Println(res)
}
Результат выполнения кода:
"new"
Смотрите также
-
метод
strings.Builder.WriteString,
который добавляет строку в билдер -
метод
strings.Builder.String,
который возвращает собранную строку -
тип
strings.Reader,
который используется для чтения из строки -
тип
bytes.Buffer,
который является аналогом для работы с байтами