0Pricing
Go Academy · レッスン

strings.Builder

効率的に文字列を構築します

「strings.Builder」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

+による連結のコスト

文字列は不変なので、s = s + partを実行するたびにまったく新しい文字列が作られ、すべてのバイトが再びコピーされます。

ループ内では、これが処理を遅くし、メモリを無駄に消費します。

package main

import "fmt"

func main() {
    s := ""
    for i := 0; i < 3; i++ {
        s = s + "go "
    }
    fmt.Println(s)
}

strings.Builderを使う

strings.Builderは内部バッファを拡張し、繰り返しのコピーを避けます。そこに書き込み、最後に一度だけ結果を読み取ります。

var b strings.Builderで宣言します。

package main

import (
    "fmt"
    "strings"
)

func main() {
    var b strings.Builder
    b.WriteString("Hello")
    fmt.Println(b.String())
}

ループ内でWriteStringを使う

本当の効果はループ内で現れます。WriteStringを繰り返し呼び出し、最後にString()で一度だけ読み取ります。

package main

import (
    "fmt"
    "strings"
)

func main() {
    var b strings.Builder
    for i := 0; i < 3; i++ {
        b.WriteString("go ")
    }
    fmt.Println(b.String())
}

バイトとruneを書き込む

Builderには完全な文字列以外も追加できます。

  • WriteByteは1つのバイトを追加します。
  • WriteRuneは1つのUnicodeコードポイントを追加します。
package main

import (
    "fmt"
    "strings"
)

func main() {
    var b strings.Builder
    b.WriteString("Go")
    b.WriteByte('!')
    b.WriteRune('語')
    fmt.Println(b.String())
}

Builderはio.Writerを実装する

Builderはio.Writerインターフェースを満たすため、fmt.Fprintfと組み合わせてバッファに直接フォーマットできます。

package main

import (
    "fmt"
    "strings"
)

func main() {
    var b strings.Builder
    fmt.Fprintf(&b, "x=%d y=%d", 3, 4)
    fmt.Println(b.String())
}

長さを確認する

b.Len()を使うと、最終的な文字列を構築せずに、その時点までに書き込まれたバイト数を確認できます。

package main

import (
    "fmt"
    "strings"
)

func main() {
    var b strings.Builder
    b.WriteString("hello")
    fmt.Println(b.Len())
}

Growで事前に容量を確保する

結果のおおよそのサイズが分かっている場合は、先にb.Grow(n)を呼び出します。これにより容量が確保され、バッファの繰り返しのサイズ変更を避けられます。

package main

import (
    "fmt"
    "strings"
)

func main() {
    var b strings.Builder
    b.Grow(64)
    for i := 0; i < 5; i++ {
        b.WriteString("item ")
    }
    fmt.Println(b.String())
}

Builderをリセットする

b.Reset()はバッファを空にするため、同じBuilderを次の文字列に再利用できます。

package main

import (
    "fmt"
    "strings"
)

func main() {
    var b strings.Builder
    b.WriteString("first")
    b.Reset()
    b.WriteString("second")
    fmt.Println(b.String())
}

Builderをコピーしない

strings.Builderは、最初に使用した後にコピーしてはいけません。受け渡す場合は、ポインタ(*strings.Builder)を使用してください。

package main

import (
    "fmt"
    "strings"
)

func add(b *strings.Builder, word string) {
    b.WriteString(word)
}

func main() {
    var b strings.Builder
    add(&b, "shared ")
    add(&b, "builder")
    fmt.Println(b.String())
}

CSV行を構築する

実用的な例として、Builderを使ってカンマ区切りの行を効率よく組み立てます。

package main

import (
    "fmt"
    "strings"
)

func main() {
    fields := []string{"id", "name", "age"}
    var b strings.Builder
    for i, f := range fields {
        if i > 0 {
            b.WriteByte(',')
        }
        b.WriteString(f)
    }
    fmt.Println(b.String())
}

Builderを使う場面

多くの断片を連結するとき、特にループ内ではstrings.Builderを使用してください。

既知のスライスを一度だけ結合する場合は、strings.Joinのほうが簡単で、速度も同程度です。

package main

import (
    "fmt"
    "strings"
)

func main() {
    var b strings.Builder
    for i := 1; i <= 3; i++ {
        fmt.Fprintf(&b, "[%d]", i)
    }
    fmt.Println(b.String())
}

クイックチェック

ループ内で+による連結を繰り返すより、Builderを使うほうがよいのはなぜですか?

まとめ:strings.Builder

効率よく文字列を構築する方法を学びました。

  • var b strings.Builderで宣言します。
  • WriteString、WriteByte、WriteRune、またはfmt.Fprintfで追加します。
  • 必要に応じて事前にGrowを呼び出し、String()で一度だけ読み取り、Builderは決してコピーしません。
package main

import (
    "fmt"
    "strings"
)

func main() {
    var b strings.Builder
    b.Grow(16)
    b.WriteString("Go ")
    b.WriteString("builder!")
    fmt.Println(b.String())
}

よくある質問

「strings.Builder」レッスンは無料ですか?

はい。「strings.Builder」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「strings.Builder」で何を学びますか?

効率的に文字列を構築します ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「strings.Builder」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Runeとバイト
  2. stringsパッケージの関数
  3. strings.Builder
  4. Unicodeとutf8
← Go Academyに戻る