go语言按字符(Rune)遍历

简介: go语言按字符(Rune)遍历

在Go语言中,字符串是以UTF-8编码的字节序列。由于UTF-8是一种变长编码,一个字符(Rune,即Unicode码点)可能由1到4个字节组成。因此,直接使用for i := 0; i < len(s); i++这样的循环来遍历字符串可能会导致错误地将一个多字节字符分割开来处理。

为了正确地按字符(Rune)遍历字符串,可以使用以下几种方法:

方法 1: 使用 range 关键字

range关键字可以自动解码UTF-8编码的字符串,并返回每一个字符(Rune)及其索引位置。

package main

import (
    "fmt"
)

func main() {
   
    s := "你好,世界!Hello, World!"
    for index, runeValue := range s {
   
        fmt.Printf("index: %d, rune: %c\n", index, runeValue)
    }
}

这里的runeValue是当前字符的Unicode码点值,而index则是该字符在原始字符串中的字节偏移量。

方法 2: 使用 utf8.DecodeRuneInString

如果你需要手动控制遍历过程,可以使用utf8包中的DecodeRuneInString函数。

package main

import (
    "fmt"
    "unicode/utf8"
)

func main() {
   
    s := "你好,世界!Hello, World!"
    for i := 0; i < len(s); {
   
        r, size := utf8.DecodeRuneInString(s[i:])
        fmt.Printf("rune: %c\n", r)
        i += size
    }
}

这里,utf8.DecodeRuneInString返回两个值:第一个是当前字符的Rune值,第二个是该字符所占的字节数。通过累加size,我们可以准确移动到下一个字符的开始位置。

这两种方法都可以让你安全地遍历包含任何Unicode字符的字符串。选择哪种方式取决于你的具体需求。如果只是简单地需要访问每个字符,推荐使用range关键字,因为它更简洁且易于理解。如果需要对索引或字符大小进行更多控制,则可能需要使用utf8.DecodeRuneInString

目录
相关文章
|
8天前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
56 1
|
2月前
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
285 0
|
2月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
199 0
|
2月前
|
Cloud Native Java 中间件
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
165 0
|
2月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
249 0
|
Go
golang遍历返回全部目录不返回具体的文件名
使用参考: d := dir.NewDir("/") dirs, err := d.LoopLevelDir(0) // 实现遍历目录的功能// 也可以指定层级遍历,遍历几层目录package dir import ( "fmt" "io/ioutil" "strings" "time" ) t...
974 0
|
2月前
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
244 1
|
8月前
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
8月前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
2月前
|
数据采集 Go API
Go语言实战案例:多协程并发下载网页内容
本文是《Go语言100个实战案例 · 网络与并发篇》第6篇,讲解如何使用 Goroutine 和 Channel 实现多协程并发抓取网页内容,提升网络请求效率。通过实战掌握高并发编程技巧,构建爬虫、内容聚合器等工具,涵盖 WaitGroup、超时控制、错误处理等核心知识点。

热门文章

最新文章