GoLang string与strings.Builder使用对比详解
创始人
2025-05-29 19:42:57

这篇文章主要介绍了GoLang string与strings.Builder使用对比,Builder 用于使用 Write 方法有效地构建字符串。它最大限度地减少了内存复制。零值可以使用了。不要复制非零生成器

一、strings.Builder的优势

以存在的内容不可变,但可以拼接更多的内容;

减少了内存分配和内存拷贝的次数;

可将可容重叠,可重用值;

二、string类型的值

在Go语言中,string类型的值是不可变的。

基于原字符串的裁剪和拼接操作:

裁剪操作可以使用切片表达式;

拼接操作可以使用操作符+实现;

一个string的内容会被存储在一块连续的内存空间中,这个连续空间的字节数量也会被记录下来,并用于表示该string值的长度。

对string类型的值,执行len() 方法,得到的是字节的数量。

var str01 string

str01 = "Go,你好"

// len(string) : 11

fmt.Printf("len(string) : %v \n", len(str01))

// len([]char): 5

fmt.Printf("len([]char): %v\n", len([]rune(str01)))

// len([]byte): 11

fmt.Printf("len([]byte): %v\n", len([]byte(str01)))

对string类型的值,进行切片操作,相当于对底层的字节数组做切片

// 在string类型的值上进行切片操作,相当于对底层的字节数组做切片

fmt.Println(str01[0:3]) // Go�

fmt.Println(str01[0:5]) // Go,

在执行字符串拼接的时候,会把所有被拼接的字符串依次拷贝到一个崭新且足够大的连续内存空间中,并把相应指针指的string值作为结果返回。

三、与string相比Builder的优势体现在拼接方面

与string相比,strings.Builder 的优势最要体现在字符串拼接方面。

Builder有一个内容容器,它是一个以byte为元素类型的切片(简称字节切片)。

Builder类型的值只能被拼接或完全覆盖。

3.1 Builder的拼接与Builder的自动扩容

可以通过Write、WriteByte、WriteRune、WriteString方法,把新的内容拼接到已存在的内容的尾部。

Builder会自动地对自身的内容容器进行扩容。扩容策略与切片的扩容策略一致。

3.2 手动扩容

Builder的值还可以手动扩容,通过调用Builder的Grow方法,就可以做到。

Grow方法接受一个int类型的参数n,这个参数表示要扩充的字节数量。

如果未用容量大于或等于n,Grow方法可能什么都不做。

3.3 Builder的重用

通过调用Reset方法,可以让Builder值重新回到零值的状态,就像它从未被使用一样。

四、strings.Builder的使用约束

springs.Builder 类型的值在已被真正使用后,就不可再被复制。

由于其内容不是完全不可变的,需要使用方自行解决操作冲突和并发安全的问题。

只要调用了Builder值的拼接或扩容方法,就意味着真正使用。一旦真正使用,Builder值就不能被复制,否则调用副本的方法会引起panic。

var sb01 strings.Builder

sb01.WriteString("Go")

sb02 := sb01

// sb02.Grow(1) // 这里会引起恐慌panic

_ = sb02

虽然Builder值不可复制,但是它的指针指却可以复制。复制的指针值会指向同一个Builder值。

对于处于零值状态的Builder值,复制不会有任何问题。所以,只要在传递之前调用Reset方法即可。

var sb01 strings.Builder

sb01.WriteString("Go")

sb01.Reset()

sb03 := sb01

sb03.Grow(1)

五、strings.Reader类型的值可以高效读取字符串

strings.Reader 类型的值,可以让我们很方便的读取一个字符串中的内容。因为,在读取的过程中,Reader值会保存已读取的字节的计数。

一读计数代表着下次读取的起始索引位置。

Reader 正是依靠这样的一个计数,以及针对字符串的切片表达式,从而实现快读读取。

通过Len方法和Size方法获取已读计数:

var reader1 strings.Reader

reader1 = *strings.NewReader("Go, 你好")

ch, size, err := reader1.ReadRune()

fmt.Printf("%v, %v, %v\n", string(ch), size, err)

readingIndex := reader1.Size() - int64(reader1.Len())

fmt.Printf("以读计数:%v\n", readingIndex)

Reader 的Seek方法用于设定下一次读取的起始索引位置;如果把io.SeekCurrent 的值作为第二个参数值传递给该方法。那么它会依据当前的已读计数,以及第一个参数offset的值来计算新的计数值。

相关内容

热门资讯

C++ Primer第五版_第... 文章目录练习4.11练习4.12练习4.13练习4.14练习4.15练习4.16练习4.17练习4....
【数据结构】千字深入浅出讲解队... 🚀write in front🚀 📝个人主页...
电子拣货标签3代系统简介 CK_Label_v3 一、产品参数  1. 电池供电版 产品型号 CK_Label_v3 尺...
2023新车上牌费用是多少?上... 今天给各位分享2023新车上牌费用是多少?上牌照需要多少钱的知识,其中也会对2022年上牌进行解释,...
荣事达竟然是美的集团旗下品牌?... 今天给各位分享荣事达竟然是美的集团旗下品牌?!的知识,其中也会对荣事达美的合并了吗进行解释,如果能碰...
火车站次查询(火车站查询车次)... 本篇文章极速百科给大家谈谈火车站次查询,以及火车站查询车次对应的知识点,希望对各位有所帮助,不要忘了...
分集水器的详细使用方法,学会供... 本篇文章极速百科给大家谈谈分集水器的详细使用方法,学会供暖不会再有办法,以及分集水器构造详图对应的知...
c++ error:cross... 最近在写代码的时候,碰到了 crosses initialization of ......
机器学习模型的性能评估方法 动动发财的小手,点个赞吧! 部署模型后,监控其性能对于确保...
俄罗斯土地面积多少平方公里(世... 本篇文章极速百科给大家谈谈俄罗斯土地面积多少平方公里,以及世界领土最大的三个国家对应的知识点,希望对...
ysl83是什么颜色 极速百科... ysl83是什么颜色目录ysl83是什么颜色ysl83是什么颜色圣罗兰纯魅唇膏86号适合黄皮女生素颜...
信用贷款怎么申请,个人信用贷款... 信用贷款怎么申请目录信用贷款怎么申请个人信用贷款怎么贷如何办理个人信用贷款?个人信用贷款怎么贷信用贷...
泾县有哪些景点,泾县十大必去景... 泾县有哪些景点目录泾县有哪些景点泾县十大必去景点泾县旅游景点泾县景点泾县有哪些景点 泾县位于安...
Leveraging Sali... Leveraging Saliency in Single-Stage Multi-Label Co...
ES-数据建模 数据模型是描述现实世界某种现象或者状态的物理抽象,比如我们之前用FSA来描述周老师的一...
进击的巨人大结局,进击的巨人漫... 进击的巨人大结局目录进击的巨人大结局进击的巨人漫画最终结局漫画《进击的巨人》大结局是什么?进击的巨人...
免单活动是什么意思 极速百科网... 免单活动是什么意思目录免单活动是什么意思免单活动是什么意思告诉我,免单是什么意思免单活动是什么意思免...
meld是手机里的什么,mel... meld是什么意思? meld是什么意思?作为全球唯一的标识,作用相当于我们每个人的。扩展资料:查找...
中华什么多奇志(中华什么多奇志... 本篇文章极速百科给大家谈谈中华什么多奇志,以及中华什么多奇志不爱红装爱武装英文对应的知识点,希望对各...
Linux C++实现进程间通... 基本知识 基本知识介绍参考:https://mp.weixin.qq.com/s/oS...
2023年ACM竞赛班 202...  目录 瞎编乱造第一题 瞎编乱造第二题 瞎编乱造第三题 瞎编乱造第四题 瞎编乱造第五题 不是很想编了...
windows安装包管理工具C... Chocolatey介绍Chocolatey 通过使用通用打包格式来管理 Windows 软件的各个...
解决:centos7如何解决网... 遇到此类问题可能会有多重解决方法,需要一个一个的去排除。 1、查看自己的网络设置是不是...
百克特1103是什么意思,请问... 百克特1103是什么意思目录百克特1103是什么意思请问,白克特1101和1103是什么病毒扫地机器...
无话不谈彼此陪伴什么意思,无话... 无话不谈彼此陪伴什么意思目录无话不谈彼此陪伴什么意思无话不谈是什么意思无话可说和无话不谈有什么区别?...
58同城企业认证的注册号是什么... 58同城企业认证的注册号是什么目录58同城企业认证的注册号是什么企业认证里的人注册号是什么我在58同...
草字头的字(草字头的字和什么有... 本篇文章极速百科给大家谈谈草字头的字,以及草字头的字和什么有关一年级对应的知识点,希望对各位有所帮助...
CentOS8提高篇2:Cen... 一、下载安装包 到wps官网下载linux版本的安装包, 根据自己的linux是 32...
这款开源管理文档管理系统兼容P... demo软件园每日更新资源,请看到最后就能获取你想要的: 1.《计算机网络实验教程》课后答案   ...
SpringBoot学习笔记(... 测试 加载测试专用属性 在启动测试环境时可以通过properties参数设置测试环境专用的属性 &#...