String类型特点
- String类型数据不可变
- 零值可用
- 获取长度len(s)时间复杂度O(1)
- + 、+= 字符串连接
- 支持比较操作符 : == 、≠ 、 ≥、 >、 <、 ≤
- 原生支持ASCII、UTF-8
- ` 多行字符串 ` 所见即所得
底层实现
runtime/string.go
string struct
- str 指向底层存储字符串的指针
- len 长度
运行时调用函数 【rowstring】实例化 string,同时创建一个临时切片。临时切片是后续运行时写入数据使用,
高效构建字符串
构建字符串的方式:
- + 号
- strings.Builder
- strings.Join
- bytes.Buffer
- fmt.Sprintf
构建效率排行
- 做了预初始化的 strings.Builder 效率最好
- 预初始化的 bytes.Buffer
- strings.Join
- fmt.Sptintf
使用场景:
- 预估字符串长度的场景下,使用strings.Builder
- strings.Join 在元素[]string 下可选用,性能最稳定
- 使用+ 最直观
- 多种不同类型变量构建 使用 fmt.Sprintf
字符串的高效转换
高效的方式是:尽量减少额外的内存使用,go编译时,会在某些常用场景下 做优化,如:stringSlicetmp 复用。
性能背后原理:
- strings.Builder 以倍数申请内存
bytes.Buffer
转化为字符串时重新申请了一块空间,存放生成的字符串变量,而strings.Builder
直接将底层的[]byte
转换成了字符串类型返回了回来。