如何高效地拼接字符串拼接字符串的方式有 , fmt.Sprintf , strings.Builder, bytes.Buffer, strings.Join“”使用操作符进行拼接时会对字符串进行遍历计算并开辟一个新的空间来存储原来的两个字符串。fmt.Sprintf由于采用了接口参数必须要用反射获取值因此有性能损耗。strings.Builder用WriteString()进行拼接内部实现是指针切片同时String()返回拼接后的字符串它是直接把[]byte转换为string从而避免变量拷贝。bytes.Bufferbytes.Buffer是一个一个缓冲byte类型的缓冲器这个缓冲器里存放着都是bytebytes.buffer底层也是一个[]byte切片。strings.joinstrings.join也是基于strings.builder来实现的,并且可以自定义分隔符在join方法内调用了b.Grow(n)方法这个是进行初步的容量分配而前面计算的n的长度就是我们要拼接的slice的长度因为我们传入切片长度固定所以提前进行容量分配可以减少内存分配很高效。性能比较strings.Join ≈ strings.Builder bytes.Buffer “” fmt.Sprintf5种拼接方法的实例代码func main(){a : []string{“a”, “b”, “c”}//方式1ret : a[0] a[1] a[2]//方式2fmt.Sprintfret : fmt.Sprintf(“%s%s%s”, a[0],a[1],a[2])//方式3strings.Buildervar sb strings.Buildersb.WriteString(a[0])sb.WriteString(a[1])sb.WriteString(a[2])ret : sb.String()//方式4bytes.Bufferbuf : new(bytes.Buffer)buf.Write(a[0])buf.Write(a[1])buf.Write(a[2])ret : buf.String()//方式5strings.Joinret : strings.Join(a,“”)}
字符串拼接【go】
如何高效地拼接字符串拼接字符串的方式有 , fmt.Sprintf , strings.Builder, bytes.Buffer, strings.Join“”使用操作符进行拼接时会对字符串进行遍历计算并开辟一个新的空间来存储原来的两个字符串。fmt.Sprintf由于采用了接口参数必须要用反射获取值因此有性能损耗。strings.Builder用WriteString()进行拼接内部实现是指针切片同时String()返回拼接后的字符串它是直接把[]byte转换为string从而避免变量拷贝。bytes.Bufferbytes.Buffer是一个一个缓冲byte类型的缓冲器这个缓冲器里存放着都是bytebytes.buffer底层也是一个[]byte切片。strings.joinstrings.join也是基于strings.builder来实现的,并且可以自定义分隔符在join方法内调用了b.Grow(n)方法这个是进行初步的容量分配而前面计算的n的长度就是我们要拼接的slice的长度因为我们传入切片长度固定所以提前进行容量分配可以减少内存分配很高效。性能比较strings.Join ≈ strings.Builder bytes.Buffer “” fmt.Sprintf5种拼接方法的实例代码func main(){a : []string{“a”, “b”, “c”}//方式1ret : a[0] a[1] a[2]//方式2fmt.Sprintfret : fmt.Sprintf(“%s%s%s”, a[0],a[1],a[2])//方式3strings.Buildervar sb strings.Buildersb.WriteString(a[0])sb.WriteString(a[1])sb.WriteString(a[2])ret : sb.String()//方式4bytes.Bufferbuf : new(bytes.Buffer)buf.Write(a[0])buf.Write(a[1])buf.Write(a[2])ret : buf.String()//方式5strings.Joinret : strings.Join(a,“”)}