1.9 文字列の結合方法

他の言語でも、文字列を大量に結合する場合にパフォーマンスが問題となることがあります。Goにもいくつか選択肢があり、ナイーブに+ 演算子を使ってループで結合するとパフォーマンスが悪くなります。

	src := []string{"Back", "To", "The", "Future", "Part", "III"}
	var title string
	for i, word := range src {
		if i != 0 {
			title += " "
		}
		title += word
	}
	log.Println(title)

Goの文字列は「不変」な文字列です。文字列に他の文字列を追加したり、一部を取り出したりといった加工を行うと、新しい文字列が生成されてメモリが確保されます。ループで1つ1つ結合するとなると、中間の文字列がすべてメモリ上に一度は確保されるため、速度が遅くなります。

大量に文字列を結合するときは、stringsパッケージのstrings.Builderを使うのが良いでしょう。結合後のサイズが分かっているのであれば Grow()を用いて内部で利用するバッファサイズを指定することもできます。

	var builder strings.Builder
	builder.Grow(100) // 最大100文字以下と仮定できる場合
	for i, word := range src {
		if i != 0 {
			builder.WriteByte(' ')
		}
		builder.WriteString(word)
	}
	log.Println(builder.String())

また数が少なく、結合する文字列の数が少なければ、1つの式でまとめて書いてしまうのも効率は悪くありません。 ...