在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个编码点前进的最惯用的方式是什么呢?
我问这个问题在金刚坚果邮寄名单,并得到了答复,感谢名单上的一些乐于助人。然而,有人给我发短信,建议我在堆栈溢出问题上创建一个自我回答的问题,以避免下一个人遇到同样的问题。这就是现在的情况。
发布于 2014-04-20 00:42:09
我会考虑避免转换到[]rune
,并直接对其进行编码。
skip := 0
for _, c := range myString {
if skip > 0 {
skip--
continue
}
skip = doSomething(c)
}
像这样一个一个地跳过runes看起来效率很低,但是它的工作量与转换到[]rune
的工作量是一样的。这段代码的优点是它避免了分配符文片段,这将大约是原始字符串的4倍(取决于您拥有的较大代码点的数量)。当然,转换到[]rune
要简单一些,所以您可能更喜欢这样。
发布于 2014-04-20 00:01:32
事实证明,这可以很简单地通过将字符串转换成一段符文来实现。
runes := []rune(myString)
for i := 0; i < len(runes); i++{
jumpHowFarAhead := doSomething(runes[i])
i += jumpHowFarAhead
}
https://stackoverflow.com/questions/23179824
复制