golangstrings.Builder
strings.Builder类型的值(以下简称Builder值)的优势有下⾯的三种:
已存在的内容不可变,但可以拼接更多的内容;
减少了内存分配和内容拷贝的次数;
可将内容重置,可重⽤值。
先来说说string类型。
我们都知道,在 Go 语⾔中,string类型的值是不可变的。如果我们想获得⼀个不⼀样的字符串,那么就只能基于原字符串进⾏裁剪、拼接等操作,从⽽⽣成⼀个新的字符串。裁剪操作可以使⽤切⽚表达式;拼接操作可以⽤操作符+实现。
因为string类型底层是数组,每次扩容都需要重新分配内存,性能是有损耗的
Builder值的优势其实主要体现在字符串拼接⽅⾯
Builder值中有⼀个⽤于承载内容的容器(以下简称内容容器)。它是⼀个以byte为元素类型的切⽚(以下
简称字节切⽚)。
切⽚可以预分配容量,因此不需要反复分配内存
由于这样的字节切⽚的底层数组就是⼀个字节数组,所以我们可以说它与string值存储内容的⽅式是⼀样的。
实际上,它们都是通过⼀个unsafe.Pointer类型的字段来持有那个指向了底层字节数组的指针值的。
var builder1 strings.Builder
builder1.WriteString("A Builder is used to efficiently build a string using Write methods.")
go语言字符串转数组fmt.Printf("The first output(%d):\n%q\n", builder1.Len(), builder1.String())
fmt.Println()
builder1.WriteByte(' ')
builder1.WriteString("It minimizes memory copying. The zero value is ready to use.")
builder1.Write([]byte{'\n', '\n'})
builder1.WriteString("Do not copy a non-zero Builder.")
fmt.Printf("The second output(%d):\n\"%s\"\n", builder1.Len(), builder1.String())
fmt.Println()
// ⽰例2。
fmt.Println("Grow the builder ...")
builder1.Grow(10) //扩容字节切⽚
fmt.Printf("The length of contents in the builder is %d.\n", builder1.Len())
fmt.Println()
// ⽰例3。
fmt.Println("Reset the builder ...")
builder1.Reset() //重置内容
fmt.Printf("The third output(%d):\n%q\n", builder1.Len(), builder1.String())

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。