在 Go 语言中,取字符串的长度有两种方式:len(content) 和 len([]rune(content)),那么它们之间的区别是什么呢?
先说结论:区别主要在于字符串的编码方式和字符长度计算上。
-
len(content):- 计算的是字符串中字节数(即
byte的数量)。 - Go 语言中的字符串是一个 UTF-8 编码的字节序列,因此
len(content)返回的是字符串占用的字节数。 - 对于 ASCII 字符(单字节字符),一个字符占 1 个字节,所以
len(content)返回的值与字符数相等。 - 对于非 ASCII 字符(如中文、Emoji 等多字节字符),每个字符占多个字节,所以
len(content)返回的字节数可能比实际字符数要多。
- 计算的是字符串中字节数(即
Example:
content := "Hello, 世界"
fmt.Println(len(content)) // 输出字节数(这里返回13,因为汉字“世”和“界”分别占3个字节)
-
len([]rune(content)):- 计算的是字符串中的字符数,每个字符对应一个
rune类型。 rune是 Go 语言中的 Unicode 码点,长度为 4 字节,专门用来表示一个 Unicode 字符(无论字符是1字节还是4字节)。- 将字符串转换为
[]rune后,Go 会根据 UTF-8 编码将字符串解析为 Unicode 字符,因此len([]rune(content))返回的是字符串中的字符个数,而不是字节数。
- 计算的是字符串中的字符数,每个字符对应一个
Example:
content := "Hello, 世界"
fmt.Println(len([]rune(content))) // 输出字符数(这里返回8)