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())
}
我们使用 Builder 的 WriteString 方法构建消息。
$ 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.Builder。