确保convert http://golang.org/ref/spec#Conversions your string http://blog.golang.org/strings进入一片符文:参见“将字符串切成字母 https://stackoverflow.com/q/18556693/6309".
for
自动转换string
to rune
因此在这种情况下不需要额外的代码来转换string
to rune
first.
for i, r := range s {
fmt.Printf("i%d r %c\n", i, r)
// every 3 i, do something
}
r[n:n+3]
与符文切片配合使用效果最佳。
该指数将增加one每个符文,虽然它可能每字节增加一以上 in a 字符串切片 http://blog.golang.org/slices#TOC_12.: "世界": i
将为 0 和 3:一个字符(符文)可以由多个字节组成。
For instance, consider s := "世a界世bcd界efg世"
: 12 runes. (see play.golang.org http://play.golang.org/p/MdsEq53DfP)
如果您尝试逐字节解析它,您将错过(在每 3 个字符实现的天真分割中)一些“索引模 3”(等于 2、5、8 和 11),因为索引将增加超过这些价值观:
for i, r := range s {
res = res + string(r)
fmt.Printf("i %d r %c\n", i, r)
if i > 0 && (i+1)%3 == 0 {
fmt.Printf("=>(%d) '%v'\n", i, res)
res = ""
}
}
输出:
i 0 r 世
i 3 r a <== miss i==2
i 4 r 界
i 7 r 世 <== miss i==5
i 10 r b <== miss i==8
i 11 r c ===============> would print '世a界世bc', not exactly '3 chars'!
i 12 r d
i 13 r 界
i 16 r e <== miss i==14
i 17 r f ===============> would print 'd界ef'
i 18 r g
i 19 r 世 <== miss the rest of the string
但如果你要迭代符文(a := []rune(s)
),您将得到您所期望的结果,因为索引一次会增加一个符文,从而可以轻松聚合恰好 3 个字符:
for i, r := range a {
res = res + string(r)
fmt.Printf("i%d r %c\n", i, r)
if i > 0 && (i+1)%3 == 0 {
fmt.Printf("=>(%d) '%v'\n", i, res)
res = ""
}
}
Output:
i 0 r 世
i 1 r a
i 2 r 界 ===============> would print '世a界'
i 3 r 世
i 4 r b
i 5 r c ===============> would print '世bc'
i 6 r d
i 7 r 界
i 8 r e ===============> would print 'd界e'
i 9 r f
i10 r g
i11 r 世 ===============> would print 'fg世'