3 回答
TA贡献1844条经验 获得超8个赞
Go 将字符串作为 UTF-8 编码的字节序列存储在内存中。这会以字节为单位一对一地映射 ASCII 字符,但超出该范围的字符会映射到多个字节。
所以我建议在字符串上使用循环,该for range
循环覆盖字符串的符文(字符),正确解码多字节符文。这样做的好处是它不需要分配(与将 转换为 不同string
)[]rune
。您也可以使用 打印对fmt.Printf("%c%c", char1, char2)
,这也不需要分配(与将rune
s 转换回string
并连接它们不同)。
要了解有关 Go 中的字符串、字符和符文的更多信息,请阅读博客文章:Go 中的字符串、字节、符文和字符
由于循环仅返回迭代中的“当前”符文(而不是前一个或下一个符文),因此使用另一个变量来存储前一个(和第一个)符文,以便在打印时可以访问它们。
让我们编写一个函数,根据需要打印对:
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
TA贡献1784条经验 获得超2个赞
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)]))
}
}
TA贡献1827条经验 获得超4个赞
这是对字符串的简单 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])
}
}
- 3 回答
- 0 关注
- 179 浏览
添加回答
举报