登录
首页 >  Golang >  Go问答

怎样在 Go 中迭代字符串的每两个相邻字符?

来源:stackoverflow

时间:2024-03-24 10:51:46 144浏览 收藏

在 Go 中,可以通过使用 for range 循环来迭代字符串的每两个相邻字符。该循环将返回字符串中的每个字符(符文),可以使用 fmt.printf() 函数打印字符对。为了确保每次迭代都能访问前一个字符,需要使用另一个变量来存储它。此方法可以避免不必要的分配,并可以有效地处理多字节字符。

问题内容

我有一个像这样的字符串:

package main

import "fmt"

func main() {
    some := "p1k4"

    for i, j := range some {
            fmt.Println()
    }
}

我想取出字符串中的每两个连续字符并打印它们。输出应类似于 p1, 1k, k4, 4p

我已经尝试过,但仍然找不到答案,我应该如何在 go 中编写代码并获得我想要的输出?


正确答案


package main

import (
    "fmt"
)

func main() {
    str := "12345"
    for i := 0; i < len(str); i++ {
        fmt.println(string(str[i]) + string(str[(i+1)%len(str)]))
    }

}

go 将字符串作为 utf-8 编码的字节序列存储在内存中。这会以字节为单位一对一映射 ascii 字符,但该范围之外的字符会映射到多个字节。

因此,我建议在字符串上使用 for range 循环,该循环范围覆盖字符串的符文(字符),正确解码多字节符文。这样做的优点是不需要分配(与将 string 转换为 []rune 不同)。您还可以使用 fmt.printf("%c%c", char1, char2) 打印这些对,这也不需要分配(与将 runes 转换回 string 并连接它们不同)。

要了解有关 go 中的字符串、字符和符文的更多信息,请阅读博客文章:Strings, bytes, runes and characters in Go

由于循环仅返回迭代中的“当前”符文(而不是前一个或下一个符文),因此请使用另一个变量来存储前一个(和第一个)符文,以便在打印时可以访问它们。 p>

让我们编写一个函数来根据需要打印对:

func printpairs(s string) {
    var first, prev rune

    for i, r := range s {
        if i == 0 {
            first, prev = r, r
            continue
        }
        fmt.printf("%c%c, ", prev, r)
        prev = r
    }

    // print last pair: prev is the last rune
    fmt.printf("%c%c\n", prev, first)
}

使用您的输入和另一个具有多字节符文的字符串对其进行测试:

printpairs("p1k4")
printpairs("go-世界")

输出将为(在 Go Playground 上尝试):

p1, 1k, k4, 4p
Go, o-, -世, 世界, 界G

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>