Go言語で文字列の連結をメモリを無駄にせず省力・効率的に行うにはstringsパッケージのBuilder

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.Builderfmt.Sprintfを使用するとGo言語で無駄なメモリやガーベージコレクションのオーバーヘッドなしで文字列を効率的に連結できます。

巨大なループ処理をするときにはこちらを活用しましょう。