04.5.1 rune是什么?
rune是一个类型为int32的值,因此他主要用来代表一个Unicode码点。Unicode码点是一个代表Unicode字符的数值。
NOTE:你可以认为字符串是一系列rune的集合
rune字面量实际上是一个用单引号括起来的字符,并且与与Unicode码点的概念相关联。
rune.go将分两部分阐述rune的使用,第一部分是:
1
package main
2
3
import (
4
"fmt"
5
)
6
7
func main() {
8
const r1 = '€'
9
fmt.Println("(int32) r1:", r1)
10
fmt.Printf("(HEX) r1: %x\n", r1)
11
fmt.Printf("(as a String) r1: %s\n", r1)
12
fmt.Printf("(as a character) r1: %c\n", r1)
Copied!
首先定义了一个rune字面量r1,然后使用不同的方式去打印,分别是int32、十六进制、字符串、字符,最终你会发现使用字符格式打印出的与定义r1的值相同。
第二部分:
1
fmt.Println("A string is a collection of runes:", []byte("Mihalis"))
2
aString := []byte("Mihalis")
3
for x, y := range aString {
4
fmt.Println(x, y)
5
fmt.Printf("Char: %c\n", aString[x])
6
}
7
fmt.Printf("%s\n", aString)
8
}
Copied!
显而易见,字节切片实际上就是一系列runes的集合,并且如果你使用fmt.Println()打印字节切片,结果很可能不会符合你的预期。fmt.Printf()语句结合%c可以将runes转换为字符输出;如果想要以字符串的形式输出字节数组,应使用fmt.Printf()结合%s
执行runes.go得到下面的输出:
go run runes.go
1
(int32) r1: 8364
2
(HEX) r1: 20ac
3
(as a String) r1: %!s(int32=8364)
4
(as a character) r1: €
5
A string is a collection of runes: [77 105 104 97 108 105 115]
6
0 77
7
Char: M
8
1 105
9
Char: i
10
2 104
11
Char: h
12
3 97
13
Char: a
14
4 108
15
Char: l
16
5 105
17
Char: i
18
6 115
19
Char: s
20
Mihalis
Copied!
最后,举一个产生illegal rune literal错误的例子:在导包的时候使用单引号。
$ cat a.go
package main
import (
'fmt'
)
func main(){
}
$ go run a.go
package main:a.go:4:2: illegal rune literal
Last modified 2yr ago
Copy link