目录
更多关于Go的相关技术点,敬请关注公众号:CTO Plus后续的发文,有问题欢迎后台留言交流。
本文原文:Go中字符串的遍历技巧:轻松操作文本
在Go语言中,我们经常需要对字符串进行遍历和转换操作。在公众号CTO Plus前面的一篇文章中,我已经对Go的字符串进行了详细的讲解和介绍,具体可以翻阅查看《Go语言字符串操作大揭秘:高效处理文本》。本文我将介绍下Go语言中遍历字符串的几种常见方法,以及通过详细代码示例演示这些功能特性,分别为如下几种方式:
-
方式1:在Go语言中,字符串是不可变的字节序列,可以通过索引访问单个字符,所以可以使用for循环结合索引来进行字符串的遍历操作。
-
方式2:通过for range的方式对字符串进行遍历。
-
方式3:使用rune来遍历字符串。
-
方式4:使用unicode/utf8包中的函数遍历含有中文的字符串。
-
方式5:当我们需要对字符串进行遍历和转换操作时,Go语言中的strings.Map()函数是一个非常有用的工具。它可以对字符串中的每个字符进行操作,并返回一个新的字符串,我们将通过一个实际的示例来演示如何使用strings.Map()函数对字符串进行遍历和转换。
方法一:使用for循环和索引
可以使用for循环和索引来遍历字符串。例如:
url := "https://mp.weixin.qq.com/s/0yqGBPbOI6QxHqK17WxU8Q"
for i := 0; i < len(url); i++ {
fmt.Printf("%c",url[i])
}
上面的代码使用for循环和索引i遍历字符串str。通过str[i]可以获取字符串中的单个字符,并使用%c格式化符号打印出来。
方法二:使用for循环和range关键字
可以使用for循环和range关键字来遍历字符串。range关键字会返回字符串的索引和对应的字符。for range 结构是Go语言特有的一种的迭代结构,在许多情况下都非常有用,for range 可以遍历数组、切片、字符串、map 及通道(channel),for range 语法上类似于其它语言中的 foreach 语句,例如:
url := "https://mp.weixin.qq.com/s/0yqGBPbOI6QxHqK17WxU8Q"
for index, char := range url {
fmt.Printf("%v %c\n",index, char)
}
上面的代码使用for循环和range关键字遍历字符串str。通过range关键字可以同时获取字符串的索引和对应的字符,并打印出来。
for _, char := range url {
fmt.Printf("%c",char)
}
在这个例子中,使用了一个匿名变量_来忽略索引。
需要要注意的是,char始终为集合中对应索引的值拷贝,因此它一般只具有只读性质,对它所做的任何修改都不会影响到集合中原有的值。
方法三:使用rune遍历字符串
一个字符串是 Unicode 编码的字符(或称之为 rune )集合,因此也可以用它来迭代字符串:
每个 rune 字符和索引在 for range 循环中是一一对应的,它能够自动根据 UTF-8 规则识别 Unicode 编码的字符。
下面这段代码展示了如何遍历字符串:
func runeRange() {
url := "https://mp.weixin.qq.com/s/0yqGBPbOI6QxHqK17WxU8Q"
fmt.Println("index int(rune) rune char bytes")
for index, rune := range url {
fmt.Printf("%-2d %d %U '%c' % X\n", index, rune, rune, rune, []byte(string(rune)))
}
}
输出结果
更多关于Go的相关技术点,敬请关注公众号:CTO Plus后续的发文,有问题欢迎后台留言交流。
方法四:使用unicode/utf8包中的函数
如果需要按照Unicode字符遍历字符串,可以使用unicode/utf8包中的函数。例如:
在Go语言中,可以使用unicode/utf8包中的函数对字符串进行遍历操作。这个包提供了一些函数来处理UTF-8编码的字符串。
下面是一个使用unicode/utf8包中的函数对字符串进行遍历操作的实战案例:
package main
import (
"fmt"
"unicode/utf8"
)
func rangeUnicode(){
str2 := "Chinese: 中文,微信公众号:CTO Plus"
fmt.Printf("The length of str2 is: %d\n", len(str2)) //The length of str2 is: 44
// 使用range循环遍历字符串中的字符
for pos, char := range str2 {
fmt.Printf("character %c starts at byte position %d\n", char, pos)
}
// 使用utf8.RuneCountInString()函数获取字符串中的字符数量
charCount := utf8.RuneCountInString(str2)
fmt.Printf("字符数量: %d\n", charCount) // 字符数量: 26
for i := 0; i < len(str2); {
r, size := utf8.DecodeRuneInString(str2[i:])
fmt.Printf("%c", r)
i+=size
} // Chinese: 中文,微信公众号:CTO Plus
}
在上面的例子中,我们首先定义了一个UTF-8编码的字符串"Chinese: 中文,微信公众号:CTO Plus"。然后,我们使用utf8.RuneCountInString()函数获取字符串中的字符数量,并使用len()函数获取字符串的字节长度。这里要注意,字符串的字节长度和字符数量不一定相等,因为UTF-8编码下,一个字符可能占用多个字节。
接下来,我们使用utf8.DecodeRuneInString()函数逐个获取字符串中的字符,并使用fmt.Printf()函数打印每个字符。这个函数接受一个字符串参数和一个索引参数,返回该索引处的字符和字符的字节大小。我们使用一个循环来遍历字符串中的每个字符,并将索引增加字符的字节大小,以获取下一个字符。
最后,我们使用range循环遍历字符串中的字符。range循环会自动将字符串转换为UTF-8编码的字符序列,并逐个返回字符。我们使用fmt.Printf()函数打印每个字符。
这个实战案例展示了如何使用unicode/utf8包中的函数对字符串进行遍历操作,包括获取字符数量、逐个获取字符和使用range循环遍历字符。这些函数可以帮助我们更方便地处理UTF-8编码的字符串。
输出结果
上面的代码使用unicode/utf8包中的函数遍历字符串str。通过range关键字可以获取字符串中的每个Unicode字符,并打印出来。
需要注意的是,字符串是以UTF-8编码存储的,一个字符可能占用多个字节。Unicode字符可能由多个字节组成,所以在遍历字符串时,每次迭代返回的是一个Unicode字符。
更多关于Go的相关技术点,敬请关注公众号:CTO Plus后续的发文,有问题欢迎后台留言交流。
方法五:使用strings.Map() 函数
在开发过程中,很多时候我们需要对一个字符串中的每一个字符都做相对应的处理,在Go语言中,提供了 strings.Map() 函数 实现了这样的功能。
strings.Map()函数用于对字符串中的每个字符应用一个函数,并返回处理后的字符串。这个函数接受一个映射函数作为参数,该映射函数接受一个字符作为输入,并返回一个字符作为输出。
我们先看下strings.Map()函数的源码
函数释义:
参数1:mapping 对字符串中每一个字符的处理函数。
参数2:s 要处理的目标字符串(原字符串)。
返回值:返回处理后的字符串。
对字符串 s 中的每一个字符都做mapping 处理。mapping是一个匿名函数,接受一个rune类型的参数,返回的也是一个 rune 类型的参数。
下面是一个使用strings.Map()函数的实战案例:
代码示例1
package main
import (
"fmt"
"strings"
)
func strMap(){
fmt.Println(information) // 公众号:CTO Plus,blog:https://mp.weixin.qq.com/s/0yqGBPbOI6QxHqK17WxU8Q
result := strings.Map(func(r rune) rune {
if r == 'q' {
return 'Q'
}
return r
}, information)
fmt.Println(result) // 公众号:CTO Plus,blog:https://mp.weixin.QQ.com/s/0yQGBPbOI6QxHQK17WxU8Q
}
在上面的例子中,我们定义了一个匿名函数作为strings.Map()函数的参数。这个匿名函数接受一个字符作为输入,并根据字符的值进行映射。如果字符是字母"q",则将其替换为大写的字母"Q",否则保持原样。最后,strings.Map()函数会对字符串中的每个字符应用这个映射函数,并返回处理后的字符串。
同样的方法可以参考公众号CTO Plus文章《Go语言字符串操作大揭秘:高效处理文本》中的strings.FieldsFunc()、strings.IndexFunc()
代码示例2:rune与strins.Map的联合使用
遍历字符串,将字符串每一个字符后移一位
// 定义一个字符串类型
var WEIXIN_URL = "https://mp.weixin.qq.com/s/0yqGBPbOI6QxHqK17WxU8Q"
func strEncry(r rune) rune{
return r+1
}
func stringsOperator(){
// 字符串遍历
for key, val := range WEIXIN_URL {
//代码中的变量 val,实际类型是 rune 类型,以十六进制打印出来就是字符的编码。
fmt.Printf("key:%d value:%c-%x\n", key, val, val)
}
//使用strings.Map()函数将一个字符串中的每个字符都往后移一位
strURL := WEIXIN_URL
fmt.Println(strURL) // https://mp.weixin.qq.com/s/0yqGBPbOI6QxHqK17WxU8Q
mapStr := strings.Map(strEncry, strURL)
fmt.Println(mapStr) //iuuqt;00nq/xfjyjo/rr/dpn0t01zrHCQcPJ7RyIrL28XyV9R
}
我们定义了一个字符串类型的变量WEIXIN_URL,接着我们使用字符串的 strings.Map() 函数将字符串每一位字符使用 strEncry 函数进行处理,并使用 fmt.Println 打印最终的结果。
strEncry 函数实现了将字符的ASCII 码加一的功能,即字符往后移动一位,因此我们传入的字符串是 “https://mp.weixin.qq.com/s/0yqGBPbOI6QxHqK17WxU8Q”,最终变成了 “iuuqt;00nq/xfjyjo/rr/dpn0t01zrHCQcPJ7RyIrL28XyV9R”。
更多关于Go的相关技术点,敬请关注公众号:CTO Plus后续的发文,有问题欢迎后台留言交流。
结论
本文介绍了Go语言中遍历字符串的几种常见方法。通过for循环和索引、for循环和range关键字、使用strings包和unicode/utf8包中的函数,可以方便地遍历字符串并处理其中的字符。
字符串遍历方法:1、使用“for range”语句遍历,语法“for key, value := range str {...}”;2、使用strings包的Map()函数来遍历,语法“trings.Map(func(rune), 原字符串)”,其中参数“func(rune)”是一个回调函数,用于对字符串中每一个字符进行处理。
通过掌握这些方法,可以更好地处理和操作字符串。
更多精彩,关注我公号,一起学习、成长
推荐阅读: