数据结构
字符串
字符串是不可变字节(byte
)序列,其本身是一个符合结构.
1 | type stringStruct struct { |
头部指针指向字节数组,但没有NULL
结尾。默认以UTF-8
编码存储Unicode
字符,字面量里允许使用十六进制、八进制和UTF
编码格式。
内置函数
len
返回字节数组长度,cap
不接受字符串类型参数。
字符串默认值不是nil
, 而是""
.
使用for
遍历字符串是,分byte
和rune
两种方式。
1 | func main () { // byte |
要修改字符串,须将其转换为可变类型([]rune
或[]byte
), 待完成后再转换回来。但不管怎么转换,都须重新分配内存,并复制数据。
1 | func pp(format string, ptr interface{}) { |
编译器会为了某些场合进行专门优化,避免额外分配和复制操作:
- 将
[]byte
转换为string key
, 去map[string]
查询的时候。 - 将
string
转换为[]byte
, 进行for range
迭代时,直接取字节赋值给局部变量。
除了类型转换外,动态构建字符串也容易造成性能问题。
用加法操作符拼接字符串时,每次都须重新分配内存。如此,在构建超大字符串时,性能就显得极差。
改进思路时预分配i足够大的空间。常用方法是用string.Join
函数,他会统计所有参数长度,并一次性完成内存分配操作。
另外
utf8.ValidString(s) 返回s是不是一个有效的字符串
utf8.RuneCountInString(s) 替代len
返回unicode
的字符数量