Skip to content

高性能地拼接字符串 #68

@kevinyan815

Description

@kevinyan815

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

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions