golang 字符串

基础

字符串内部是用指针指向UTF-8字节数组

  内置的len函数以及string[index]都是以字节为单位操作字符串,通过len函数遍历字符串可以发现,由于golang使用UTF-8编码方式存储字符串,每个字母和汉字所占用的字节数是不同的。

1
2
3
4
5
6
7
8
9
10
11
12
13
package main
import (
"fmt"
)
func main() {
str := "utwoo博客"
for i := 0; i < len(str); i++ {
fmt.Printf("%c,", str[i]) //u,t,w,o,o,å,,š,å,®,¢,
}
}

单引号字符常量

单引号字符常量表示一个Unicode Code Point(Unicode码点), 对应rune类型(int32)。
每一个rune都是一个UTF-32或者UCS-4, 使用\uFFFF或者\u7FFFFFFF形式定义。
使用rune类型转换或使用range遍历字符串可以获得字符串码点的数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package main
import (
"fmt"
)
func main() {
str := "utwoo博客"
for _, s := range str {
fmt.Printf("%c,", s) //u,t,w,o,o,博,客,
}
us := []rune(str)
for i := 0; i < len(us); i++ {
fmt.Printf("%c,", us[i]) //u,t,w,o,o,博,客,
}
}

字符串是不可变类型

字符串是不可变的字节序列,直接通过字符串索引修改字符是不允许的。

1
2
3
4
5
6
package main
func main() {
str := "utwoo博客"
str[2] = 's' //compile error: cannot assign to str[2]
}

可以通过将字符串转换为字节切片或者rune切片修改字符串内容,但实质上会为新字符串重新分配内存。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main
import (
"fmt"
)
func main() {
str := "utwoo博客"
bs := []rune(str)
bs[1] = 'T'
str2 := string(bs)
fmt.Println(str2) // uTwoo博客
}