Вы можете просмотреть обсуждение списка изменений, который представил strings.Builder
api здесь: https://go-review.googlesource.com/c/go/+/74931/4/src/strings/builder.go#30
Как и следовало ожидать, это обсуждение механики API, корректности, и эффективность.
Если вы замените код на string(b.buf)
, вы создадите копию созданной строки. Может случиться так, что компилятор оптимизирует копию в простых случаях преобразования байтового среза в строку, но очень маловероятно, что компилятор может сделать это здесь в целом (потому что для этого потребуется доказательство того, что буфер внутри построителя строк является больше никогда не использовался).
Обратите внимание, что код (стандартной библиотеки) выглядит опасно, потому что, если вы напишете это:
var b strings.Builder
b.WriteString("hello world")
c := b.String()
b.WriteString("a")
d := b.String()
, тогда c
и d
будут указывать к той же памяти. Но это нормально, потому что строки содержат длину своего буфера. И нет никакого способа изменить строку, потому что, хотя теоретически память, поддерживающая строку, доступна через buf
в strings.Builder
, единственный предоставленный API добавляется в резервную память.