TL;DR
go1.10からのstrings.Builderは実態はGoのBufferタイプと同じ。アロケーションが発生しないので多量な文字結合するならばstrings.Bufferを使っていこう。
ベンチマークコード
vs_test.go
package main
import (
"strings"
"testing"
)
func Benchmark_string(b *testing.B) {
var s string
b.StartTimer()
for i := 0; i < b.N; i++ {
s += "a"
}
b.StopTimer()
}
func Benchmark_stringsBuilder(b *testing.B) {
var sb strings.Builder
b.StartTimer()
for i := 0; i < b.N; i++ {
sb.WriteString("a")
}
_ = sb.String() // output string
b.StopTimer()
}
結果
圧倒的にstrings.Builderが速い
$ go test -bench . -benchmem
goos: darwin
goarch: amd64
Benchmark_string-4 769185 52775 ns/op 388557 B/op 1 allocs/op
Benchmark_stringsBuilder-4 204743859 5.09 ns/op 5 B/op 0 allocs/op
PASS