Go言語では文字列はイミュータブルであり文字列を変更するたびに新しい文字列がメモリ上に展開されます。
大きなループ処理で文字列を連結する場合にパフォーマンスの問題が発生することがあります。
なぜなら各連結操作で新しい文字列が作成されて、不必要なメモリ割り当てとガベージコレクションのオーバーヘッドが発生するためです。
逆をいえば小さいループなら気にする必要ありません。
Go言語を使っているなら無駄なメモリを省き、速度を少しでも早く動かしたいはずですよね。
そこで効率的な文字列の連結方法を解説します。
Go言語で文字列の連結をメモリを無駄にせず省力・効率的に行う方法
Go言語で文字列を効率的に連結するには、strings.Builder
型を使用します。
strings.Builder型は文字列を効率的に扱うために設計された型であり、不必要な中間文字列を作成せずに文字列を連結できます。
以下は、2つの文字列を連結する例です。
Builder型のWriteString(), String()メソッドを使う場合
こちらは長い文字列でも最も効率的に文字列連結をできるサンプルコードになります。
package main
import "strings"
func main() {
var builder strings.Builder
builder.WriteString("こんにちは、")
builder.WriteString("世界!")
result := builder.String()
println(result)
}
この例では、strings.Builder{}
を呼び出して、新しいstrings.Builder
値を作成しています。WriteString
メソッドを使用して、2つの文字列をbuilderに追加しています。
3つやれば、3つの文字列が連結できます。
最後に、String
メソッドを呼び出して連結された文字列を取得しています。
fmt.Sprintf()メソッドを使う方法
fmt.Sprintf関数を使用して文字列を連結することもできます。
長い文字列、大きな文字列に対してはfmt.Sprintf
を使用することはstrings.Builder
を使用するよりも非効率です
でも短い・小さな数の文字列を連結する場合には、よりシンプルでよく使うfmtパッケージのメソッドで実現できる方法です。
package main
import "fmt"
func main() {
name := "世界"
message := fmt.Sprintf("こんにちは、%s!", name)
println(message)
}
この例ではfmt.Sprintf
を使用して、name
変数を文字列に挿入しています。
fmt.Sprintf
はフォーマットされた文字列を返し、それをmessage
変数に代入しています。最後に、message
変数を出力し、連結された文字列を表示しています。
まとめ
strings.Builder
とfmt.Sprintf
を使用するとGo言語で無駄なメモリやガーベージコレクションのオーバーヘッドなしで文字列を効率的に連結できます。
巨大なループ処理をするときにはこちらを活用しましょう。