在Go中迭代unicode字符串时跳过n个代码点

时间:2014-04-20 08:00:44

标签: go

在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上为此创建一个自我回答的问题,为同一个问题保存下一个人有些麻烦。这是什么。

2 个答案:

答案 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
}