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())
}

在 playground 中尝试

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注