我有一个像这样的字符串:
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 中编写代码并获得我想要的输出?
Go 将字符串作为 UTF-8 编码的字节序列存储在内存中。这会以字节为单位一对一映射 ASCII 字符,但该范围之外的字符会映射到多个字节。
\n因此,我建议对for range字符串使用循环,该循环范围覆盖字符串的符文(字符),正确解码多字节符文。这样做的优点是不需要分配(与转换为 不同string)[]rune。您还可以使用 打印对fmt.Printf("%c%c", char1, char2),这也不需要分配(与将runes 转换回string并连接它们不同)。
要了解有关 Go 中的字符串、字符和符文的更多信息,请阅读博客文章:Go 中的字符串、字节、符文和字符
\n由于循环仅返回迭代中的“当前”符文(而不是前一个或下一个符文),因此请使用另一个变量来存储前一个(和第一个)符文,以便在打印时可以访问它们。
\n让我们编写一个函数来根据需要打印对:
\nfunc 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}\nRun Code Online (Sandbox Code Playgroud)\n使用您的输入和另一个具有多字节符文的字符串对其进行测试:
\nprintPairs("p1k4")\nprintPairs("Go-\xe4\xb8\x96\xe7\x95\x8c")\nRun Code Online (Sandbox Code Playgroud)\n输出将是(在Go Playground上尝试):
\np1, 1k, k4, 4p\nGo, o-, -\xe4\xb8\x96, \xe4\xb8\x96\xe7\x95\x8c, \xe7\x95\x8cG\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
663 次 |
| 最近记录: |