在Go中,使用
迭代字符串for i := 0; i < len(myString); i++{
doSomething(myString[i])
}
只访问字符串中的单个字节,而通过
遍历字符串for i, c := range myString{
doSomething(c)
}
迭代单个Unicode代码点(在Go中称为rune
),可能跨越多个字节。
我的问题是:在使用range Mystring
迭代字符串时,如何继续前进? continue
可以通过一个unicode代码点向前跳,但是如果你想跳过三个代码点,那么就不可能只执行i += 3
。那么,通过n个代码点推进前进的最惯用方法是什么呢?
我在golang坚果邮件列表上asked this question,并且由于名单上的一些有用的人提供了答案。有人告诉我,但是建议我在Stack Overflow上为此创建一个自我回答的问题,为同一个问题保存下一个人有些麻烦。这是什么。
答案 0 :(得分:6)
我会考虑避免转换为[]rune
,并直接对此进行编码。
skip := 0
for _, c := range myString {
if skip > 0 {
skip--
continue
}
skip = doSomething(c)
}
像这样逐个跳过符文似乎效率低下,但与转换到[]rune
的工作量相同。这段代码的优点是它避免了分配符文切片,符文切片大约是原始字符串的4倍(取决于你拥有的更大代码点的数量)。当然,转换为[]rune
会稍微简单一点,所以你可能会喜欢这个。
答案 1 :(得分:2)
事实证明,只需将字符串转换为一片符文即可轻松完成。
runes := []rune(myString)
for i := 0; i < len(runes); i++{
jumpHowFarAhead := doSomething(runes[i])
i += jumpHowFarAhead
}