Go中字符串的遍历技巧:轻松操作文本

目录

方法一:使用for循环和索引

方法二:使用for循环和range关键字

方法三:使用rune遍历字符串

方法四:使用unicode/utf8包中的函数

方法五:使用strings.Map() 函数

结论


图片

更多关于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)”是一个回调函数,用于对字符串中每一个字符进行处理。

通过掌握这些方法,可以更好地处理和操作字符串。

更多精彩,关注我公号,一起学习、成长

图片

推荐阅读:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SteveRocket

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值