01-数据类型之值类型之 byte 和 rune

组成每个字符串的元素叫做字符。可以通过遍历或者单个获取字符串元素获得字符,遍历的函数有两个,分别是 byte 和 rune

byte

byte 是 uint8 的别称,使用 byte 主要是为了区分字节和无符号整型两种类型

byte 代表了 ASCII 码的一个字符,直接打印字节输出的是 ascii 码,字节必须使用单引号包起来,需要通过格式化输出

示例:

1
2
3
4
func main() {
var a byte
fmt.Printf("%v, type: %T, char: %c", a, a, a)
}

输出:

1
0, type: uint8, char:

rune

rune 是 int32 的别称,使用 rune 主要是为了区分字符和整型两种类型

rune 代表一个 UTF-8 字符,字符必须使用单引号包起来

当需要处理中文、日文或其他复合字符时,需要使用 rune 类型。rune 类型实际是一个 int32

示例:

1
2
3
4
func main() {
var a rune
fmt.Printf("%v, type: %T, char: %c\n", a, a, a)
}

输出结果:

1
0, type: int32, char:

byte & rune

  • byte 表示一个字节,可以表示英文字符等占用一个字节的字符,占用多于一个字节的字符就无法正确表示,例如占用 3 个字节的汉字
  • rune 表示一个字符,用来表示任何一个字符

示例:

1
2
3
4
5
6
func main() {
a := "你好,hello"
b := []byte(a)
c := []rune(a)
fmt.Printf("b: %v\ntype: %T\n\nc: %v\ntype: %T", b, b, c, c)
}

输出结果:

1
2
3
4
5
b: [228 189 160 229 165 189 239 188 140 104 101 108 108 111]
type: []uint8

c: [20320 22909 65292 104 101 108 108 111]
type: []int32

可以看出 byte 并不能正确解析超过 1 byte 的字符,需要使用 rune

转换

byte 和 rune 之间可以转换,

  • byte 转向 rune 时不会出错
  • rune 转向 byte 时会出现问题:
    • 如果 rune 表示的字符只占用一个字符,不超过 uint8 时不会出错;
    • 超过时直接转换编译无法通过,可以通过引用转换,但是会舍去超出的位,出现错误结果

示例:

1
2
3
4
5
6
7
8
9
func main() {
char := '你'
v1 := rune(char)
v2 := byte(char)
s1 := strconv.FormatInt(int64(v1), 2)
s2 := strconv.FormatInt(int64(v2), 2)
fmt.Printf("v1: %c, type: %T, %v\n", v1, v1, s1)
fmt.Printf("v2: %c, type: %T, %v\n", v2, v2, s2)
}

输出结果:

1
2
v1: 你, type: int32, 100111101100000
v2: `, type: uint8, 1100000

01-数据类型之值类型之 byte 和 rune
https://flepeng.github.io/021-Go-31-Go-基础-01-数据类型之值类型之-byte-和-rune/
作者
Lepeng
发布于
2024年12月2日
许可协议