如何在 Go 中对 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
,其中 k
是由 range
指令提供的索引。
UPD1:
可以对 utf-8
rune
进行反向(从右到左)查找,因为我们可以很容易地识别 rune
每个字节或字节组的顺序位。摘自 The Go Programming Language
一书:
如您所见,我们可以从最后一个字节开始,我们最多需要向左扫描 4 个字节才能获得 rune
。
最佳答案
最简单的解决方案是将 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 上试试这个.
关于string - 反转字符串范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70130406/