如何在go中对字符串中的每两个连续字符进行迭代



我有一个这样的字符串:

package main
import "fmt"
func main() {
some := "p1k4"
for i, j := range some {
fmt.Println()
}
}

我想取字符串中的每两个连续字符并打印它们。输出应该像CCD_ 1。

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

Go将字符串作为UTF-8编码的字节序列存储在内存中。这将ASCII字符映射为一对一的字节,但超出该范围的字符映射为多个字节。

因此,我建议在字符串上使用for range循环,它的范围在字符串的符文(字符(上,从而正确地解码多字节符文。这具有不需要分配的优点(不同于将string转换为[]rune(。您也可以使用fmt.Printf("%c%c", char1, char2)打印对,这也不需要分配(不同于将rune转换回string并连接它们(。

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

由于循环只返回"0";当前";在迭代中的符文(但不是前一个或下一个符文(,使用另一个变量来存储前一个(和第一个(符文,以便在打印时可以访问它们。

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

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%cn", prev, first)
}

用你的输入和另一个有多字节符文的字符串测试它:

printPairs("p1k4")
printPairs("Go-世界")

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

p1, 1k, k4, 4p
Go, o-, -世, 世界, 界G
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)]))
}
}

这是一个简单的for循环,在字符串后面附加第一个字符:

package main
import "fmt"
func main() {
some := "p1k4"
ns := some + string(some[0])
for i := 0; i < len(ns)-1; i++ {
fmt.Println(ns[i:i+2])
}
}

最新更新