Efficient string concatenation [full guide]

yourbasic.org/golang

Clean and simple string building

For simple cases where performance is a non-issue, fmt.Sprintf is your friend. It’s clean, simple and fairly efficient.

s := fmt.Sprintf("Size: %d MB.", 85)

The fmt cheat sheet lists the most common formatting verbs and flags.

High-performance string concatenation Go 1.10

A strings.Builder is used to efficiently append strings using write methods.

It offers a subset of the bytes.Buffer methods that allows it to safely avoid extra copying when converting a builder to a string.

methods that allows it to safely avoid extra copying when converting a builder to a string. You can use the fmt package for formatting since the builder implements the io.Writer interface.

package for formatting since the builder implements the interface. The Grow method can be used to preallocate memory when the maximum size of the string is known.

var b strings.Builder b.Grow(32) for i, p := range []int{2, 3, 5, 7, 11, 13} { fmt.Fprintf(&b, "%d:%d, ", i+1, p) } s := b.String() s = s[:b.Len()-2] fmt.Println(s)

1:2, 2:3, 3:5, 4:7, 5:11, 6:13

Before Go 1.10

Use fmt.Fprintf to print into a bytes.Buffer .

var buf bytes.Buffer for i, p := range []int{2, 3, 5, 7, 11, 13} { fmt.Fprintf(&buf, "%d:%d, ", i+1, p) } buf.Truncate(buf.Len() - 2) s := buf.String() fmt.Println(s)

1:2, 2:3, 3:5, 4:7, 5:11, 6:13

This solution is pretty efficient but may generate some excess garbage. For higher performance, you can try to use the append functions in package strconv .

buf := []byte("Size: ") buf = strconv.AppendInt(buf, 85, 10) buf = append(buf, " MB."...) s := string(buf)

If the expected maximum length of the string is known, you may want to preallocate the slice.

buf := make([]byte, 0, 16) buf = append(buf, "Size: "...) buf = strconv.AppendInt(buf, 85, 10) buf = append(buf, " MB."...) s := string(buf)

Further reading

40+ practical string tips [cheat sheet]

Share this page: