Skip to content

Commit 48db2c0

Browse files
committed
all: use strings.Builder instead of bytes.Buffer where appropriate
I grepped for "bytes.Buffer" and "buf.String" and mostly ignored test files. I skipped a few on purpose and probably missed a few others, but otherwise I think this should be most of them. Updates #18990 Change-Id: I5a6ae4296b87b416d8da02d7bfaf981d8cc14774 Reviewed-on: https://go-review.googlesource.com/102479 Run-TryBot: Brad Fitzpatrick <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Ian Lance Taylor <[email protected]>
1 parent f0eca37 commit 48db2c0

File tree

16 files changed

+56
-86
lines changed

16 files changed

+56
-86
lines changed

src/archive/tar/writer.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
package tar
66

77
import (
8-
"bytes"
98
"fmt"
109
"io"
1110
"path"
@@ -176,7 +175,7 @@ func (tw *Writer) writePAXHeader(hdr *Header, paxHdrs map[string]string) error {
176175
sort.Strings(keys)
177176

178177
// Write each record to a buffer.
179-
var buf bytes.Buffer
178+
var buf strings.Builder
180179
for _, k := range keys {
181180
rec, err := formatPAXRecord(k, paxHdrs[k])
182181
if err != nil {

src/cmd/cover/html.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"math"
1616
"os"
1717
"path/filepath"
18+
"strings"
1819
)
1920

2021
// htmlOutput reads the profile data from profile and generates an HTML
@@ -41,7 +42,7 @@ func htmlOutput(profile, outfile string) error {
4142
if err != nil {
4243
return fmt.Errorf("can't read %q: %v", fn, err)
4344
}
44-
var buf bytes.Buffer
45+
var buf strings.Builder
4546
err = htmlGen(&buf, src, profile.Boundaries(src))
4647
if err != nil {
4748
return err

src/expvar/expvar.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
package expvar
2323

2424
import (
25-
"bytes"
2625
"encoding/json"
2726
"fmt"
2827
"log"
@@ -32,6 +31,7 @@ import (
3231
"runtime"
3332
"sort"
3433
"strconv"
34+
"strings"
3535
"sync"
3636
"sync/atomic"
3737
)
@@ -111,7 +111,7 @@ type KeyValue struct {
111111
}
112112

113113
func (v *Map) String() string {
114-
var b bytes.Buffer
114+
var b strings.Builder
115115
fmt.Fprintf(&b, "{")
116116
first := true
117117
v.Do(func(kv KeyValue) {

src/go/types/methodset.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
package types
88

99
import (
10-
"bytes"
1110
"fmt"
1211
"sort"
12+
"strings"
1313
)
1414

1515
// A MethodSet is an ordered set of concrete or abstract (interface) methods;
@@ -24,7 +24,7 @@ func (s *MethodSet) String() string {
2424
return "MethodSet {}"
2525
}
2626

27-
var buf bytes.Buffer
27+
var buf strings.Builder
2828
fmt.Fprintln(&buf, "MethodSet {")
2929
for _, f := range s.list {
3030
fmt.Fprintf(&buf, "\t%s\n", f)

src/mime/encodedword.go

Lines changed: 17 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
"fmt"
1212
"io"
1313
"strings"
14-
"sync"
1514
"unicode"
1615
"unicode/utf8"
1716
)
@@ -51,16 +50,15 @@ func needsEncoding(s string) bool {
5150

5251
// encodeWord encodes a string into an encoded-word.
5352
func (e WordEncoder) encodeWord(charset, s string) string {
54-
buf := getBuffer()
55-
defer putBuffer(buf)
53+
var buf strings.Builder
5654

57-
e.openWord(buf, charset)
55+
e.openWord(&buf, charset)
5856
if e == BEncoding {
59-
e.bEncode(buf, charset, s)
57+
e.bEncode(&buf, charset, s)
6058
} else {
61-
e.qEncode(buf, charset, s)
59+
e.qEncode(&buf, charset, s)
6260
}
63-
closeWord(buf)
61+
closeWord(&buf)
6462

6563
return buf.String()
6664
}
@@ -77,7 +75,7 @@ const (
7775
var maxBase64Len = base64.StdEncoding.DecodedLen(maxContentLen)
7876

7977
// bEncode encodes s using base64 encoding and writes it to buf.
80-
func (e WordEncoder) bEncode(buf *bytes.Buffer, charset, s string) {
78+
func (e WordEncoder) bEncode(buf *strings.Builder, charset, s string) {
8179
w := base64.NewEncoder(base64.StdEncoding, buf)
8280
// If the charset is not UTF-8 or if the content is short, do not bother
8381
// splitting the encoded-word.
@@ -109,7 +107,7 @@ func (e WordEncoder) bEncode(buf *bytes.Buffer, charset, s string) {
109107

110108
// qEncode encodes s using Q encoding and writes it to buf. It splits the
111109
// encoded-words when necessary.
112-
func (e WordEncoder) qEncode(buf *bytes.Buffer, charset, s string) {
110+
func (e WordEncoder) qEncode(buf *strings.Builder, charset, s string) {
113111
// We only split encoded-words when the charset is UTF-8.
114112
if !isUTF8(charset) {
115113
writeQString(buf, s)
@@ -139,7 +137,7 @@ func (e WordEncoder) qEncode(buf *bytes.Buffer, charset, s string) {
139137
}
140138

141139
// writeQString encodes s using Q encoding and writes it to buf.
142-
func writeQString(buf *bytes.Buffer, s string) {
140+
func writeQString(buf *strings.Builder, s string) {
143141
for i := 0; i < len(s); i++ {
144142
switch b := s[i]; {
145143
case b == ' ':
@@ -155,7 +153,7 @@ func writeQString(buf *bytes.Buffer, s string) {
155153
}
156154

157155
// openWord writes the beginning of an encoded-word into buf.
158-
func (e WordEncoder) openWord(buf *bytes.Buffer, charset string) {
156+
func (e WordEncoder) openWord(buf *strings.Builder, charset string) {
159157
buf.WriteString("=?")
160158
buf.WriteString(charset)
161159
buf.WriteByte('?')
@@ -164,12 +162,12 @@ func (e WordEncoder) openWord(buf *bytes.Buffer, charset string) {
164162
}
165163

166164
// closeWord writes the end of an encoded-word into buf.
167-
func closeWord(buf *bytes.Buffer) {
165+
func closeWord(buf *strings.Builder) {
168166
buf.WriteString("?=")
169167
}
170168

171169
// splitWord closes the current encoded-word and opens a new one.
172-
func (e WordEncoder) splitWord(buf *bytes.Buffer, charset string) {
170+
func (e WordEncoder) splitWord(buf *strings.Builder, charset string) {
173171
closeWord(buf)
174172
buf.WriteByte(' ')
175173
e.openWord(buf, charset)
@@ -224,10 +222,9 @@ func (d *WordDecoder) Decode(word string) (string, error) {
224222
return "", err
225223
}
226224

227-
buf := getBuffer()
228-
defer putBuffer(buf)
225+
var buf strings.Builder
229226

230-
if err := d.convert(buf, charset, content); err != nil {
227+
if err := d.convert(&buf, charset, content); err != nil {
231228
return "", err
232229
}
233230

@@ -243,8 +240,7 @@ func (d *WordDecoder) DecodeHeader(header string) (string, error) {
243240
return header, nil
244241
}
245242

246-
buf := getBuffer()
247-
defer putBuffer(buf)
243+
var buf strings.Builder
248244

249245
buf.WriteString(header[:i])
250246
header = header[i:]
@@ -296,7 +292,7 @@ func (d *WordDecoder) DecodeHeader(header string) (string, error) {
296292
buf.WriteString(header[:start])
297293
}
298294

299-
if err := d.convert(buf, charset, content); err != nil {
295+
if err := d.convert(&buf, charset, content); err != nil {
300296
return "", err
301297
}
302298

@@ -322,7 +318,7 @@ func decode(encoding byte, text string) ([]byte, error) {
322318
}
323319
}
324320

325-
func (d *WordDecoder) convert(buf *bytes.Buffer, charset string, content []byte) error {
321+
func (d *WordDecoder) convert(buf *strings.Builder, charset string, content []byte) error {
326322
switch {
327323
case strings.EqualFold("utf-8", charset):
328324
buf.Write(content)
@@ -346,7 +342,7 @@ func (d *WordDecoder) convert(buf *bytes.Buffer, charset string, content []byte)
346342
if err != nil {
347343
return err
348344
}
349-
if _, err = buf.ReadFrom(r); err != nil {
345+
if _, err = io.Copy(buf, r); err != nil {
350346
return err
351347
}
352348
}
@@ -422,21 +418,3 @@ func fromHex(b byte) (byte, error) {
422418
}
423419
return 0, fmt.Errorf("mime: invalid hex byte %#02x", b)
424420
}
425-
426-
var bufPool = sync.Pool{
427-
New: func() interface{} {
428-
return new(bytes.Buffer)
429-
},
430-
}
431-
432-
func getBuffer() *bytes.Buffer {
433-
return bufPool.Get().(*bytes.Buffer)
434-
}
435-
436-
func putBuffer(buf *bytes.Buffer) {
437-
if buf.Len() > 1024 {
438-
return
439-
}
440-
buf.Reset()
441-
bufPool.Put(buf)
442-
}

src/mime/mediatype.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
package mime
66

77
import (
8-
"bytes"
98
"errors"
109
"fmt"
1110
"sort"
@@ -19,7 +18,7 @@ import (
1918
// When any of the arguments result in a standard violation then
2019
// FormatMediaType returns the empty string.
2120
func FormatMediaType(t string, param map[string]string) string {
22-
var b bytes.Buffer
21+
var b strings.Builder
2322
if slash := strings.Index(t, "/"); slash == -1 {
2423
if !isToken(t) {
2524
return ""
@@ -167,7 +166,7 @@ func ParseMediaType(v string) (mediatype string, params map[string]string, err e
167166

168167
// Stitch together any continuations or things with stars
169168
// (i.e. RFC 2231 things with stars: "foo*0" or "foo*")
170-
var buf bytes.Buffer
169+
var buf strings.Builder
171170
for key, pieceMap := range continuation {
172171
singlePartKey := key + "*"
173172
if v, ok := pieceMap[singlePartKey]; ok {
@@ -265,7 +264,7 @@ func consumeValue(v string) (value, rest string) {
265264
}
266265

267266
// parse a quoted-string
268-
buffer := new(bytes.Buffer)
267+
buffer := new(strings.Builder)
269268
for i := 1; i < len(v); i++ {
270269
r := v[i]
271270
if r == '"' {

src/net/http/cookie.go

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
package http
66

77
import (
8-
"bytes"
98
"log"
109
"net"
1110
"strconv"
@@ -143,7 +142,7 @@ func (c *Cookie) String() string {
143142
if c == nil || !isCookieNameValid(c.Name) {
144143
return ""
145144
}
146-
var b bytes.Buffer
145+
var b strings.Builder
147146
b.WriteString(sanitizeCookieName(c.Name))
148147
b.WriteRune('=')
149148
b.WriteString(sanitizeCookieValue(c.Value))
@@ -168,17 +167,14 @@ func (c *Cookie) String() string {
168167
log.Printf("net/http: invalid Cookie.Domain %q; dropping domain attribute", c.Domain)
169168
}
170169
}
170+
var buf [len(TimeFormat)]byte
171171
if validCookieExpires(c.Expires) {
172172
b.WriteString("; Expires=")
173-
b2 := b.Bytes()
174-
b.Reset()
175-
b.Write(c.Expires.UTC().AppendFormat(b2, TimeFormat))
173+
b.Write(c.Expires.UTC().AppendFormat(buf[:0], TimeFormat))
176174
}
177175
if c.MaxAge > 0 {
178176
b.WriteString("; Max-Age=")
179-
b2 := b.Bytes()
180-
b.Reset()
181-
b.Write(strconv.AppendInt(b2, int64(c.MaxAge), 10))
177+
b.Write(strconv.AppendInt(buf[:0], int64(c.MaxAge), 10))
182178
} else if c.MaxAge < 0 {
183179
b.WriteString("; Max-Age=0")
184180
}

src/net/http/httptest/server.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
package httptest
88

99
import (
10-
"bytes"
1110
"crypto/tls"
1211
"crypto/x509"
1312
"flag"
@@ -17,6 +16,7 @@ import (
1716
"net/http"
1817
"net/http/internal"
1918
"os"
19+
"strings"
2020
"sync"
2121
"time"
2222
)
@@ -224,7 +224,7 @@ func (s *Server) Close() {
224224
func (s *Server) logCloseHangDebugInfo() {
225225
s.mu.Lock()
226226
defer s.mu.Unlock()
227-
var buf bytes.Buffer
227+
var buf strings.Builder
228228
buf.WriteString("httptest.Server blocked in Close after 5 seconds, waiting for connections:\n")
229229
for c, st := range s.conns {
230230
fmt.Fprintf(&buf, " %T %p %v in state %v\n", c, c, c.RemoteAddr(), st)

src/net/mail/message.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ package mail
1919

2020
import (
2121
"bufio"
22-
"bytes"
2322
"errors"
2423
"fmt"
2524
"io"
@@ -735,7 +734,7 @@ func isQtext(r rune) bool {
735734

736735
// quoteString renders a string as an RFC 5322 quoted-string.
737736
func quoteString(s string) string {
738-
var buf bytes.Buffer
737+
var buf strings.Builder
739738
buf.WriteByte('"')
740739
for _, r := range s {
741740
if isQtext(r) || isWSP(r) {

src/net/url/url.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ package url
1111
// contain references to issue numbers with details.
1212

1313
import (
14-
"bytes"
1514
"errors"
1615
"fmt"
1716
"sort"
@@ -737,7 +736,7 @@ func validOptionalPort(port string) bool {
737736
// - if u.RawQuery is empty, ?query is omitted.
738737
// - if u.Fragment is empty, #fragment is omitted.
739738
func (u *URL) String() string {
740-
var buf bytes.Buffer
739+
var buf strings.Builder
741740
if u.Scheme != "" {
742741
buf.WriteString(u.Scheme)
743742
buf.WriteByte(':')
@@ -878,20 +877,21 @@ func (v Values) Encode() string {
878877
if v == nil {
879878
return ""
880879
}
881-
var buf bytes.Buffer
880+
var buf strings.Builder
882881
keys := make([]string, 0, len(v))
883882
for k := range v {
884883
keys = append(keys, k)
885884
}
886885
sort.Strings(keys)
887886
for _, k := range keys {
888887
vs := v[k]
889-
prefix := QueryEscape(k) + "="
888+
keyEscaped := QueryEscape(k)
890889
for _, v := range vs {
891890
if buf.Len() > 0 {
892891
buf.WriteByte('&')
893892
}
894-
buf.WriteString(prefix)
893+
buf.WriteString(keyEscaped)
894+
buf.WriteByte('=')
895895
buf.WriteString(QueryEscape(v))
896896
}
897897
}

0 commit comments

Comments
 (0)