反转字符串范围

如何在 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在哪里。krange


UPD1:可以对 s 进行反向(从右到左)查找,因为我们可以通过每个字节或字节组的高位utf-8 rune轻松识别s。runeThe Go Programming Language书: 如您所见,我们可以从最后一个字节开始,我们需要向左扫描最多 4 个字节才能得到一个.

http://img2.mukewang.com/634d07230001f11a06290096.jpg

rune

ibeautiful
浏览 85回答 2
2回答

慕村225694

最简单的解决方案是将 to 转换string为[]rune,因此您可以对其进行迭代,但索引“向后”(或使用向下循环):rs := []rune(s)max := len(rs) - 1for 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

你可以做:runes:=[]rune(str)for x:=len(runes)-1; x>=0; x-- {   // work with runes[x]}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go