Golang 中的 Strings 包详解之 Strings.Builder

开发 后端
对于有大量字符串拼接的场景,建议使用 Strings.Builder,而不是直接使用“+”运算符来拼接字符串,以避免频繁的内存分配问题。在使用 Strings.Builder 对象时,如果想重复使用,可以使用 Reset() 方法来清空 Builder 中的字符串。

strings.Builder

strings.Builder 是 Golang 中的一个用于高效构建字符串的类型,使用了一个循环缓冲区来存储字符数据,避免了频繁的内存分配和拷贝操作,尤其适用于频繁拼接字符串的场景。结构体定义和对应的方法如下:

type Builder struct {
  addr *Builder // of receiver, to detect copies by value
	buf  []byte
}

func (b *Builder) Grow(n int)
func (b *Builder) Len() int
func (b *Builder) Cap() int
func (b *Builder) Reset()
func (b *Builder) String() string
func (b *Builder) Write(p []byte) (int, error)
func (b *Builder) WriteByte(c byte) error
func (b *Builder) WriteRune(r rune) (int, error)
func (b *Builder) WriteString(s string) (int, error)

其中比较常用的方法有:

  • Reset() :重置 Builder 中的字符串内容,使得 Builder 可以重新生成新的字符串。
  • WriteString(s string) (int, error) :向 Builder 中追加一个字符串,并返回字符串追加后的长度以及可能存在的错误。
  • String() string :返回 Builder 中生成的字符串。

优势

与许多语言一样,Golang 中的 string 类型也是不可变的,如果想在一个字符串的基础上得到另一个字符串,只能基于这个字符串做截取、拼接,截取可以使用切片表达式、拼接可以使用“+”运算符来实现。

如果代码中有大量的使用切片表达式和“+”运算符进行截取拼接,会导致频繁的内存分配。在底层,一个 string 类型的值会被存储到一块连续的内存空间中,可以把这块内存的内容看成一个字节数组,string 值则包含了指向字节数组头部的指针值,使用切片表达式操作 string 就相当于对底层的字节数组做切片。很显然,大量的字符串拼接操作会导致很大的内存分配压力。

使用示例

简单使用示例如下:

package main

import (
	"fmt"
	"strings"
)

func main() {
	var builder strings.Builder    // 声明一个 Builder 变量
	builder.WriteString("Hello, ") // 追加字符串
	builder.WriteString("world!")  // 追加字符串
	fmt.Println(builder.String())  // 输出结果
}

输出结果为:

Hello, world!

首先创建了一个 strings.Builder 对象 builder,然后使用 WriteString 方法向缓冲区中写入字符串,最后使用 String 方法将缓冲区中的字符数据转换为字符串。

小结

对于有大量字符串拼接的场景,建议使用 strings.Builder,而不是直接使用“+”运算符来拼接字符串,以避免频繁的内存分配问题。在使用 strings.Builder 对象时,如果想重复使用,可以使用 Reset() 方法来清空 Builder 中的字符串。如果在使用 strings.Builder 进行字符串拼接的时候需要一定的缓存空间,可以使用 Grow(n int) 方法来预分配内存,提高程序的执行效率。例如:

var builder strings.Builder
builder.Grow(1024) // 预分配 1K 内存空间
责任编辑:姜华 来源: 今日头条
相关推荐

2023-09-05 08:22:44

Golangstrings 包

2023-09-06 09:10:04

Golang字符串

2023-12-11 08:39:14

Go语言字符串拼

2023-10-18 08:22:38

BufioGolang

2023-10-10 08:57:44

Golangbufio

2023-10-07 09:08:32

Golangbufio

2023-11-07 09:02:07

Golangbytes

2023-09-07 07:35:54

GolangBufio

2009-08-21 15:37:13

C#空格

2023-11-27 15:02:37

BytesGolang

2023-08-03 08:48:07

Golang接口

2011-04-19 11:02:51

Linux命令

2023-08-02 09:07:27

Golangio 包

2021-02-04 18:17:46

Go 版本API

2023-08-31 09:28:12

Golang可导出函数

2023-05-12 09:40:53

ContextGolang

2010-05-24 17:23:41

Linux SNMP

2023-08-28 17:16:51

Golangio 包

2024-01-18 09:07:04

Errors函数Golang

2023-11-03 08:53:15

StrconvGolang
点赞
收藏

51CTO技术栈公众号