// A Builder is used to efficiently build a string using Write methods.// It minimizes memory copying. The zero value is ready to use.// Do not copy a non-zero Builder.type Builder struct{
addr *Builder // of receiver, to detect copies by value
buf []byte}
// grow copies the buffer to a new, larger buffer so that there are at least n// bytes of capacity beyond len(b.buf).func(b *Builder)grow(n int){
buf :=make([]byte,len(b.buf),2*cap(b.buf)+n)copy(buf, b.buf)
b.buf = buf
}// Grow grows b's capacity, if necessary, to guarantee space for// another n bytes. After Grow(n), at least n bytes can be written to b// without another allocation. If n is negative, Grow panics.func(b *Builder)Grow(n int){
b.copyCheck()if n <0{panic("strings.Builder.Grow: negative count")}ifcap(b.buf)-len(b.buf)< n {
b.grow(n)}}
// A Reader implements the io.Reader, io.ReaderAt, io.Seeker, io.WriterTo,// io.ByteScanner, and io.RuneScanner interfaces by reading// from a string.type Reader struct{
s string
i int64// current reading index
prevRune int// index of previous rune; or < 0}
// Len returns the number of bytes of the unread portion of the// string.func(r *Reader)Len()int{if r.i >=int64(len(r.s)){return0}returnint(int64(len(r.s))- r.i)}// Size returns the original length of the underlying string.// Size is the number of bytes available for reading via ReadAt.// The returned value is always the same and is not affected by calls// to any other method.func(r *Reader)Size()int64{returnint64(len(r.s))}
func(r *Reader)ReadAt(b []byte, off int64)(n int, err error){// cannot modify state - see io.ReaderAtif off <0{return0, errors.New("strings.Reader.ReadAt: negative offset")}if off >=int64(len(r.s)){return0, io.EOF
}
n =copy(b, r.s[off:])if n <len(b){
err = io.EOF
}return}