0%

Go基础之字符和字符串处理

rune类型就相当于Go语言中的char,占4个字节,为int32别名

使用range遍历 postion, rune

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
s := "Yes我爱Go语言!" // UTF-8

for _, b := range []byte(s) {
fmt.Printf("%X ", b)
}

for i, ch := range s { // ch is a rune
fmt.Printf("(%d %X) ", i, ch)
// ch这里是int32,就是rune,为4字节,但是utf-8类型在这里转成了unicode2字节型存储
// 所以4字节中只占了两个字节 (3 6211)
// 因为遍历的是单个字节,但是返回的是position rune对,所以跳过了中间的字符的单字节
}
// 结果
59 65 73 E6 88 91 E7 88 B1 47 6F E8 AF AD E8 A8 80 21
(0 59) (1 65) (2 73) (3 6211) (6 7231) (9 47) (10 6F) (11 8BED) (14 8A00) (17 21)

使用utf8.RuneCountInString获得字符的数量,因为使用len()只能获得字节数(英文占1个字节,中文3个utf-8编码下)

1
2
3
fmt.Println("len count":len(s))    //18

fmt.Println("Rune count:", utf8.RuneCountInString(s)) //10

使用[]byte获得字节,使用[]rune会获得字符切片, 实际上是用该类型的切片进行强制转换

1
2
3
4
5
6
s := "Yes我爱Go语言!" // UTF-8
for _, b := range []byte(s) {
fmt.Printf("%X ", b)
}
// 结果
59 65 73 E6 88 91 E7 88 B1 47 6F E8 AF AD E8 A8 80 21

使用utf8.DecodeRune将utf8解码为四字节unicode,但是Unicode中文编码只用了两个字节

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main

import (
"fmt"
"unicode/utf8"
)

func main() {
s := "我" // UTF-8
a := []byte(s)
ch, size := utf8.DecodeRune(a)
fmt.Printf("%X, %d",ch, size)
}
// 结果
6211, 3

字符串的其他操作,都在strings.包内

  • Fieds Split Join
  • Contains, Index
  • ToLower ToUpper
  • Trim TrimRight TrimLeft