kevinyan815 / gocookbook

go cook book
MIT License
788 stars 167 forks source link

高性能地拼接字符串 #68

Open kevinyan815 opened 3 years ago

kevinyan815 commented 3 years ago

在Go中字符串是原生类型,是只读的,所以用"+"操作符进行字符串时会创建一个新的字符串。如果在循环中使用"+"进行字符串拼接则会创建多个字符串,比如下面这样:

var s string
for i := 0; i < 1000; i++ {
    s += "a"
}

那么怎么更高效得进行字符串拼接呢?在早先Go1.10 以前使用的是bytes.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())
}

Go 1.10版本后引入了一个strings.Builder类型,它是这么用的:

package main

import (
    "strings"
    "fmt"
)

func main() {
    var str strings.Builder

    for i := 0; i < 10; i++ {
        str.WriteString("a")
    }

    fmt.Println(str.String())
}

会比使用 "+" 或 "+=" 性能高三到四个数量级。

Talent-hu commented 1 year ago

还有join拼接,这个的也很好