0

0

Go语言:字符串遍历与字符(Rune)处理指南

心靈之曲

心靈之曲

发布时间:2025-11-02 14:47:19

|

602人浏览过

|

来源于php中文网

原创

Go语言:字符串遍历与字符(Rune)处理指南

go语言中,直接索引字符串会得到字节值,而通过`for...range`循环遍历字符串时,第二个返回值是unicode码点(rune)。本文将详细介绍如何在go语言中正确地遍历字符串,获取并处理其字符值,而非原始的字节或数字表示,并通过示例代码演示如何将rune类型转换为可读的字符字符串,确保对多字节字符的正确处理。

理解Go语言中的字符串与字符

在Go语言中,字符串是不可变的字节切片,通常以UTF-8编码存储。这意味着字符串的长度是其字节数,而不是字符数。当我们通过索引str[i]访问字符串时,我们实际上获取的是该索引处的字节值(byte类型),而非一个字符。对于ASCII字符,一个字节即一个字符,所以str[i]会返回其ASCII码。然而,对于非ASCII字符(如中文、表情符号或某些特殊符号),一个字符可能由多个字节组成,此时str[i]将无法正确地表示一个完整的字符。

rune是Go语言中用于表示Unicode码点的内置类型,它是int32的别名。在处理需要识别单个字符(无论是单字节还是多字节)的场景时,rune是关键。

常见的遍历误区

许多初学者在遍历字符串时,可能会遇到以下两种情况,导致无法直接获取到期望的字符:

  1. 直接索引获取字节值: 当使用传统的for循环并结合str[i]时,会得到每个位置的字节值。

    package main
    
    import "fmt"
    
    func main() {
        str := "Hello"
        fmt.Println("--- 错误示例:直接索引获取字节值 ---")
        for i := 0; i < len(str); i++ {
            // str[i] 返回的是 byte 类型,打印时会显示其十进制数值
            fmt.Printf("索引: %d, 字节值: %d, 字符: %c\n", i, str[i], str[i])
        }
        // 输出:
        // 索引: 0, 字节值: 72, 字符: H
        // 索引: 1, 字节值: 101, 字符: e
        // 索引: 2, 字节值: 108, 字符: l
        // 索引: 3, 字节值: 108, 字符: l
        // 索引: 4, 字节值: 111, 字符: o
    }

    虽然%c格式化动词可以将字节值解释为字符,但对于多字节字符,str[i]依然是单个字节,无法构成完整字符。

    立即学习go语言免费学习笔记(深入)”;

  2. for...range循环获取rune的数值: Go语言提供了for...range循环来遍历字符串中的Unicode码点。循环的第二个返回值是rune类型。然而,直接打印rune类型变量时,fmt.Println默认会打印其底层的整数值。

    package main
    
    import "fmt"
    
    func main() {
        str := "Hello"
        fmt.Println("\n--- 错误示例:for...range 直接打印rune数值 ---")
        for i, elem := range str {
            // elem 是 rune 类型,直接打印会显示其Unicode码点对应的整数值
            fmt.Println(i, elem)
        }
        // 输出:
        // 0 72
        // 1 101
        // 2 108
        // 3 108
        // 4 111
    }

    这种方式虽然正确地迭代了Unicode码点,但输出的是码点数值,而非字符本身。

    Flowise
    Flowise

    一款开源的低代码/无代码AI应用开发工具

    下载

正确获取字符串字符值的方法

要正确地遍历字符串并获取其字符值,应该使用for...range循环,并将获取到的rune类型值显式地转换为string类型。

for...range语句在遍历字符串时,会按照Unicode码点(rune)进行迭代。每次迭代,它会返回两个值:

  • 第一个值是当前rune的起始字节索引。
  • 第二个值是当前rune的实际值(rune类型)。

通过将这个rune值转换为string类型,我们就可以得到一个包含单个字符的字符串。

package main

import "fmt"

func main() {
    str := "Hello Go 你好" // 包含多字节字符的字符串

    fmt.Println("--- 正确示例:for...range 遍历并转换为字符字符串 ---")
    for i, r := range str {
        // r 是 rune 类型 (Unicode 码点)
        // string(r) 将 rune 转换为包含该字符的字符串
        charStr := string(r)
        fmt.Printf("索引: %d, Rune值: %d, 字符: %s\n", i, r, charStr)
    }

    // 期望输出(注意索引是字节索引,不是字符索引):
    // 索引: 0, Rune值: 72, 字符: H
    // 索引: 1, Rune值: 101, 字符: e
    // 索引: 2, Rune值: 108, 字符: l
    // 索引: 3, Rune值: 108, 字符: l
    // 索引: 4, Rune值: 111, 字符: o
    // 索引: 5, Rune值: 32, 字符:
    // 索引: 6, Rune值: 71, 字符: G
    // 索引: 7, Rune值: 111, 字符: o
    // 索引: 8, Rune值: 32, 字符:
    // 索引: 9, Rune值: 20320, 字符: 你
    // 索引: 12, Rune值: 22909, 字符: 好
}

在上述示例中,i表示当前rune在原始字符串中的起始字节索引。对于多字节字符(如“你”和“好”),i的增量会大于1,因为它跳过了该字符占用的所有字节。r是rune类型,其值为Unicode码点。string(r)则将这个码点转换成一个包含对应字符的字符串。

注意事项与总结

  1. rune是处理字符的关键: 在Go语言中,如果需要按字符(而非字节)进行操作,始终应该考虑使用rune类型。
  2. for...range是遍历Unicode字符的推荐方式: 它能够正确处理UTF-8编码的多字节字符,每次迭代提供一个完整的Unicode码点。
  3. string(rune)进行类型转换: 当从for...range获取到rune值后,若要显示或进一步处理为字符串形式的字符,务必使用string(r)进行类型转换。
  4. 索引的含义: for...range循环返回的第一个值是rune在原始字符串中的字节索引,而不是字符的逻辑索引。如果需要字符的逻辑索引,需要手动维护一个计数器。
  5. 处理无效UTF-8序列: 如果字符串中包含无效的UTF-8序列,for...range循环会将其识别为Unicode替换字符(0xFFFD),并继续前进一个字节。

通过掌握for...range循环和rune类型,开发者可以有效地在Go语言中处理字符串,确保对各种字符集(特别是多字节Unicode字符)的正确操作,避免因字节级操作而导致的乱码或逻辑错误。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

443

2023.08.02

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

298

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1500

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

623

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

613

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

588

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

171

2025.07.29

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

31

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 4.3万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号