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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Runeとバイト
- stringsパッケージの関数
- strings.Builder
- Unicodeとutf8