Тип strings.Builder

Тип strings.Builder используется для эффективного построения строк путем добавления фрагментов. В отличие от конкатенации с помощью оператора +, которая создает новую строку при каждом объединении, Builder накапливает данные во внутреннем буфере и преобразует их в строку только один раз - при вызове метода String. Основные методы типа - это WriteString для добавления строки и String для получения итоговой строки.

Создание и базовое использование

gopackage main

import (
  "fmt"
  "strings"
)

func main() {
  var builder strings.Builder
  builder.WriteString("Hello, ")
  builder.WriteString("World!")
  res := builder.String()
  fmt.Println(res)
}

Результат выполнения кода:

go"Hello, World!"

Метод WriteString

Метод WriteString добавляет переданную строку в буфер strings.Builder. Он возвращает количество добавленных байтов и возможную ошибку (всегда nil при работе со строкой). Рассмотрим пример накопления нескольких строк:

gopackage 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)
}

Результат выполнения кода:

go"line line line "

Метод String

Метод String возвращает собранную строку на основе содержимого внутреннего буфера. После вызова этого метода новые добавления не влияют на ранее полученную строку, поскольку она является копией данных:

gopackage 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)
}

Результат выполнения кода:

go"first" "firstsecond"

Предварительное выделение памяти

Для повышения производительности можно предварительно выделить память под будущую строку с помощью метода Grow. Это позволяет избежать многократного перераспределения памяти при добавлении большого количества фрагментов. Рассмотрим пример:

gopackage 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)
}

Результат выполнения кода:

go"helloworld"

Сброс буфера

Метод Reset очищает внутренний буфер strings.Builder, делая его пустым и готовым к повторному использованию:

gopackage main

import (
  "fmt"
  "strings"
)

func main() {
  var builder strings.Builder
  builder.WriteString("old")
  builder.Reset()
  builder.WriteString("new")
  res := builder.String()
  fmt.Println(res)
}

Результат выполнения кода:

go"new"

Смотрите также

  • метод strings.Builder.WriteString,
    который добавляет строку в билдер
  • метод strings.Builder.String,
    который возвращает собранную строку
  • тип strings.Reader,
    который используется для чтения из строки
  • тип bytes.Buffer,
    который является аналогом для работы с байтами