https://stackoverflow.com/questions/1760757/how-to-efficiently-concatenate-strings-in-go
问题
在 Go 语言中,string
是一个原始类型,这意味着它是只读的,且所有修改都会创建一个新的 string
。
所以如果我想在不知道最终长度的情况下,频繁的连接字符串,用哪种方式比较好?
这种方式可能比较笨:
var s string
for i := 0; i < 1000; i++ {
s += getShortStringFromSomewhere()
}
return s
而且看上去不怎么高效
回答
bytes.Buffer
使用 bytes
包中实现了 io.Writer
的类 Buffer
。
package main
import (
"bytes"
"fmt"
)
func main() {
var buffer bytes.Buffer
for i := 0; i < 1000; i++ {
buffer.WriteString("a")
}
fmt.Println(buffer.String())
}
这样做的时间复杂度是 O(n)。
strings.Builder
在 Go 1.10+ 中提供了 strings.Builder
类,见这里。
A Builder is used to efficiently build a string using Write methods. It minimizes memory copying. The zero value is ready to use.
即:
Builder
类被用作高效地使用写入函数建立字符串。它将内存拷贝减到最少。可以直接使用它的零值。
它用起来与 bytes.Buffer
几乎一样。
package main
import (
"strings"
"fmt"
)
func main() {
// ZERO-VALUE:
//
// It's ready to use from the get-go.
// You don't need to initialize it.
var sb strings.Builder
for i := 0; i < 1000; i++ {
sb.WriteString("a")
}
fmt.Println(sb.String())
}