如何迭代 go 中字符串中的每 2 个连续字符?

Bri*_*ian 2 string go

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

package main

import "fmt"

func main() {
    some := "p1k4"

    for i, j := range some {
            fmt.Println()
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

icz*_*cza 9

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

\n

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

\n

要了解有关 Go 中的字符串、字符和符文的更多信息,请阅读博客文章:Go 中的字符串、字节、符文和字符

\n

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

\n

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

\n
func printPairs(s string) {\n    var first, prev rune\n\n    for i, r := range s {\n        if i == 0 {\n            first, prev = r, r\n            continue\n        }\n        fmt.Printf("%c%c, ", prev, r)\n        prev = r\n    }\n\n    // Print last pair: prev is the last rune\n    fmt.Printf("%c%c\\n", prev, first)\n}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
printPairs("p1k4")\nprintPairs("Go-\xe4\xb8\x96\xe7\x95\x8c")\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
p1, 1k, k4, 4p\nGo, o-, -\xe4\xb8\x96, \xe4\xb8\x96\xe7\x95\x8c, \xe7\x95\x8cG\n
Run Code Online (Sandbox Code Playgroud)\n