Language
strings.Builder: 書き込み後にコピーするとpanicになる
書き込み済みのstrings.Builderを値コピーして再利用すると、実行時にpanicします。
Sourcebuilder_copy.go
Go 1.22
package stringexample
import "strings"
func CopyAfterWritePanics() (recovered any) {
var builder strings.Builder
builder.WriteString("go")
copied := builder
defer func() {
recovered = recover()
}()
copied.WriteString("tests")
return nil
}Testbuilder_copy_test.go
Go 1.22
package stringexample
import "testing"
func Test書き込み後のstringsBuilderをコピーするとpanicになる(t *testing.T) {
if recovered := CopyAfterWritePanics(); recovered == nil {
t.Fatal("CopyAfterWritePanics() did not panic")
}
}01Assertion
このテストで確認できること
- 文字列を書き込んだBuilderを値コピーする
- コピー側へのWriteStringがpanicする
strings.Builderは内部状態を持つため、最初の書き込み後はコピーしません。Builderを関数へ渡すならポインタで扱うか、文字列へ確定してから渡します。
OBSERVED RESULT
builder.WriteString("go")
copied := builder
copied.WriteString(...) → panic