← Backend / Go / 基础专题

15_字符串字节与rune

区分字节长度和字符数量,完成文本与数字的转换。

Go 基础专题 15:字符串、字节与 rune

学习目标:区分字节长度和字符数量,完成文本与数字的转换。

核心知识

Go 的 string 是不可变的字节序列,通常存储 UTF-8 文本,但也可以包含任意字节。len(text) 返回字节数,不是 Unicode 字符数。text[i] 取得第 i 个字节;for _, r := range text 按 UTF-8 解码得到 rune(码点)。显示成一个字形的内容可能含多个码点,因此码点数也不等于用户感知的字数。

package main

import (
    "fmt"
    "unicode/utf8"
)

func main() {
    text := "Go中"
    fmt.Println(len(text), utf8.RuneCountInString(text)) // 5 3
    for byteIndex, letter := range text {
        fmt.Printf("%d %c\n", byteIndex, letter)
    }
}

[]byte(text) 得到字节切片,适合 I/O;[]rune(text) 得到码点切片,适合按码点操作。修改后转回字符串会复制数据。字符串拼接少量内容用 +,循环中大量拼接可用 strings.Builder。strconv.Atoi 解析十进制整数并返回错误,strconv.Itoa 生成数字文本。

易错点:不要按单字节切片中文字符串,可能截断 UTF-8 编码。

逐步理解

请分别打印 len("Go中") 与码点数:前者算 UTF-8 字节,后者算解码后的 rune。text[2] 是汉字编码的第一个字节,不能直接当汉字。对用户可见长度的限制更复杂,因为组合字符可能由多个码点组成。跨系统交换文本要明确使用 UTF-8,并在遇到非法字节时决定拒绝还是替换。

动手练习

练习:输出 "你好" 的字节数和码点数。答案:len 为 6,utf8.RuneCountInString 为 2。