我们常使用字符串拼接,当比较小时,使用哪种方式都差不多,但是当拼接数比较大时,不同的方法效率会相差很大。
go 提供了如下几种方式连接字符串:
- strings.Join
- fmt.Sprintf
- +=
- strings.Builder (go 1.10 提供)
我们先简单测试下:
1 | package main |
结果:
1 | time of [+=]: 1.1500289s |
可以看出 +=, strings.Join, fmt.Sprintf 效率相差不大,但是 strings.Builder 的效率却高了 1000倍。为什么 strings.Builder 如此变态,我们看下实现:
- strings.Join 底层是用 += 和 copy 实现的,所以效率和 += 差不多
- strings.Builder 使用 []type 数组实现;
strings.Builder 实现
Builder 可以用最小的内存拷贝来构建字符串。先看下 Builder 的简单实现:
1 | type Builder struct { |
可以看出 Builder 底层是用 []byte 实现的,每次添加字符串时,都是直接向数组最后插入值完成的,减少了不必要的内存拷贝,所以效率比较搞。