5.1 字符串
字符串是不可变字节(byte)序列,其本身是一个复合结构。
type stingStruct struct {
str unsafe.Pointer
len int
}
头部指针指向字节数组,但没有NULL结尾。默认以UTF-8编码存储Unicode字符,字面量里允许使用十六进制、八进制和UTF编码格式。
注意:
- 内置函数len返回字符数组长度,cap不接受字符串类型参数。
- 字符串默认值不是nil,而是""。
- 编译器不会解析原始字符串中的注释语句,且前置缩进空格也属于字符串。
- 允许以索引号访问字节数组(非字符),但不能获取元素地址。
- 以切片语法返回子串时,其内部依旧指向原字节数组。
- 要修改字符串,须将其转换为可变类型([]byte或[]rune),待完成后在转换回来。但不管如何转换,都须重新分配内存,并复制数据。
使用for遍历字符串时,分byte和rune两种方式:
- byte方式:for i := 0; i < len(s); i++ {}
- rune方式:for i, c := range s {}
字符串拼接方法性能排序:
+ < fmt.Sprintf <= strings.Join <= bytes.Buffer
类型rune专门用来存储Unicode码点,它是int32的别名,相当于UCS-4/UTF-32编码格式。使用单引号的字面量,其默认类型就是rune。
标准库unicode里提供了丰富的操作函数。除验证函数外,还可用RuneCountInString代替len函数返回准确的Unicode字符数量。
网友评论