如何在 Go 中“反向范围”遍历 a 的单个字符string?例如,给定s := "some string \u1222 whatever"- 我想做类似的事情:for i, v := ~reverse~ range s {
}请注意,我对通过标准库的解决方案感兴趣,而不必自己编写函数。我知道大量现有的图书馆可以做到这一点,但这无关紧要。此外 - 我不能使用len(s)和做:for i := len(s) - 1; i >= 0; i-- {
}因为 Go 内置len函数仅返回字符串中的字节数(不适用于非 ASCII 字符串)。由于上述原因,我也无法执行指令提供的索引len(s) - k - 1在哪里。krangeUPD1:可以对 s 进行反向(从右到左)查找,因为我们可以通过每个字节或字节组的高位utf-8 rune轻松识别s。rune从The Go Programming Language书: 如您所见,我们可以从最后一个字节开始,我们需要向左扫描最多 4 个字节才能得到一个.rune
2 回答
慕村225694
TA贡献1880条经验 获得超4个赞
最简单的解决方案是将 to 转换string为[]rune,因此您可以对其进行迭代,但索引“向后”(或使用向下循环):
rs := []rune(s)
max := len(rs) - 1
for i := range rs {
r := rs[max-i]
fmt.Printf("%c ", r)
}
这将输出(在Go Playground上尝试):
r e v e t a h w ሢ g n i r t s e m o s
如果你想避免[]rune
转换,你可以utf8.DecodeLastRuneInString()
这样使用:
for {
r, size := utf8.DecodeLastRuneInString(s)
if r == utf8.RuneError {
break
}
fmt.Printf("%c ", r)
s = s[:len(s)-size]
}
这输出相同,在Go Playground上试试这个。
慕哥6287543
TA贡献1831条经验 获得超10个赞
你可以做:
runes:=[]rune(str)
for x:=len(runes)-1; x>=0; x-- {
// work with runes[x]
}
- 2 回答
- 0 关注
- 83 浏览
添加回答
举报
0/150
提交
取消