Go 语言中字符串的长度计算

236 阅读1分钟

在 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)