ZetCode

Go Builder

最后修改日期:2025 年 4 月 11 日

在本文中,我们将展示如何在 Golang 中使用 strings.Builder 高效地构建字符串。

在 Go 中,可以使用各种写入方法高效地构建字符串,例如使用 WriteString 写入字符串数据,以及使用 WriteRune 追加单个 Unicode 字符。这些方法允许增量式构建字符串,从而在追加数据时实现灵活高效的修改。

为了高效地管理累积的字符串,会使用 Builder 类型。在内部,Builder 依赖于动态管理的切片来存储底层的字节数据,与直接字符串连接相比,可以减少不必要的内存分配。应用完所有期望的修改后,可以使用 String 方法检索最终字符串,该方法以不可变的形式返回完整结果。

当构建复杂或大型字符串时,使用 Builder 尤其有益,因为它最大限度地减少了重复内存分配引起的性能开销。这种方法使其成为涉及频繁字符串操作的场景的最佳选择。

Go Builder 示例

下一个示例使用 strings.Builder 来形成一条消息。

simple.go
package main

import (
    "fmt"
    "strings"
)

func main() {

    builder := strings.Builder{}

    builder.WriteString("There")
    builder.WriteString(" are")
    builder.WriteString(" three")
    builder.WriteString(" hawks")
    builder.WriteString(" in the sky")

    fmt.Println(builder.String())
}

我们使用 BuilderWriteString 方法构建消息。

$ go run simple.go 
There are three hawks in the sky

下一个示例从字节切片构建字符串。

simple2.go
package main

import (
    "fmt"
    "strings"
)

func main() {

    builder := strings.Builder{}

    data1 := []byte{72, 101, 108, 108, 111}
    data2 := []byte{32}
    data3 := []byte{116, 104, 101, 114, 101, 33}

    builder.Write(data1)
    builder.Write(data2)
    builder.Write(data3)

    fmt.Println(builder.String())
}

该示例使用 Write 构建字符串。

$ go run simple2.go 
Hello there!

Go Builder - 构建格式化字符串

在下一个示例中,我们将构建一个格式化的字符串。

formatted.go
package main

import (
    "fmt"
    "strings"
)

func main() {

    builder := strings.Builder{}

    animals := "hawks"
    n := 3

    builder.WriteString("There are ")
    builder.WriteString(fmt.Sprintf("%d %s ", n, animals))
    builder.WriteString("in the sky.")

    msg := builder.String() 

    fmt.Println(msg)
}

我们使用 fmt.Sprintf 函数创建格式化字符串,并使用 WriteString 将其追加到 builder 中。

Go Builder - 性能比较

在下一个示例中,我们将 Builder 的性能与使用 + 运算符的字符串连接进行比较。

compare.go
package main

import (
    "fmt"
    "strings"
    "time"
)

func main() {

    t0 := time.Now()

    builder := strings.Builder{}
    for i := 0; i < 100_000; i++ {
        builder.WriteString("falcon")
    }

    t1 := time.Now()

    result := ""
    for i := 0; i < 100_000; i++ {
        result += "falcon"
    }

    t2 := time.Now()

    fmt.Println(t1.Sub(t0))
    fmt.Println(t2.Sub(t1))
}

该示例对两种字符串连接方式的效率进行了基准测试;它将单词“falcon”添加了十万次。

$ go run compare.go 
2.232505ms
8.007376273s

从输出可以看出,Builder 的效率要高得多。

来源

Go strings 包 - 参考

在本文中,我们讨论了 Go 中的 strings.Builder

作者

我叫 Jan Bodnar,是一名充满热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。至今,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有超过十年的经验。

列出所有 Go 教程