Golang字符串的拼接⽅法汇总
字符串拼接在 golang ⾥⾯其实有很多种实现。
实现⽅式
直接使⽤运算符
func BenchmarkAddStringWithOperator(b *testing.B) {
hello := "hello"
world := "world"
go语言字符串转数组
for i := 0; i < b.N; i++ {
_ = hello + "," + world
}
}
golang⾥⾯的字符串都是不可变的,每次运算都会产⽣⼀个新的字符串,所以会产⽣很多临时的⽆⽤的字符串,不仅没有⽤,还会给gc带来额外的负担,所以性能⽐较差
fmt.Sprintf()
func BenchmarkAddStringWithSprintf(b *testing.B) {
hello := "hello"
world := "world"
for i := 0; i < b.N; i++ {
_ = fmt.Sprintf("%s,%s", hello, world)
}
}
内部使⽤[]byte实现,不像直接运算符这种会产⽣很多临时的字符串,但是内部的逻辑⽐较复杂,有很多额外的判断,还⽤到了interface,所以性能也不是很好
strings.Join()
func BenchmarkAddStringWithJoin(b *testing.B) {
hello := "hello"
world := "world"
for i := 0; i < b.N; i++ {
_ = strings.Join([]string{hello, world}, ",")
}
}
join会根据字符串数组的内容,计算出⼀个拼接之后的长度,然后申请对应⼤⼩的内存,⼀个⼀个字符填⼊,在已有⼀个数组的情况下,这种效率会很⾼,但是本来没有,去构造这个数据的代价也不⼩
buffer.WriteString()
func BenchmarkAddStringWithBuffer(b *testing.B) {
hello := "hello"
world := "world"
for i := 0; i < 1000; i++ {
var buffer bytes.Buffer
buffer.WriteString(hello)
buffer.WriteString(",")
buffer.WriteString(world)
_ = buffer.String()
}
}
这个⽐较理想,可以当成可变字符使⽤,对内存的增长也有优化,如果能预估字符串的长度,还可以⽤buffer.Grow()接⼝来设置capacity
测试结果
BenchmarkAddStringWithOperator-8            50000000            30.3 ns/op
BenchmarkAddStringWithSprintf-8            5000000              261  ns/op
BenchmarkAddStringWithJoin-8                30000000            58.7 ns/op
BenchmarkAddStringWithBuffer-8              2000000000          0.00 ns/op
主要结论
1. 在已有字符串数组的场合,使⽤strings.Join()能有⽐较好的性能
2. 在⼀些性能要求较⾼的场合,尽量使⽤buffer.WriteString()以获得更好的性能
3. 性能要求不太⾼的场合,直接使⽤运算符,代码更简短清晰,能获得⽐较好的可读性
4. 如果需要拼接的不仅仅是字符串,还有数字之类的其他需求的话,可以考虑fmt.Sprintf()

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