我想这样:
for i := 0; i < len(str); i++ {
dosomethingwithrune(str[i]) // takes a rune
}
但事实证明,str[i]
的类型为byte
(uint8
),而不是rune
。
如何用符文而不是字节迭代字符串?
答案 0 :(得分:38)
请参阅Effective Go中的此示例:
for pos, char := range "日本語" {
fmt.Printf("character %c starts at byte position %d\n", char, pos)
}
打印:
character 日 starts at byte position 0
character 本 starts at byte position 3
character 語 starts at byte position 6
对于字符串,范围对您来说更有用,可以打破个人 Unicode代码通过解析UTF-8来指出。
答案 1 :(得分:7)
例如:
package main
import "fmt"
func main() {
for i, rune := range "Hello, 世界" {
fmt.Printf("%d: %c\n", i, rune)
}
}
输出:
0: H
1: e
2: l
3: l
4: o
5: ,
6:
7: 世
10: 界
答案 2 :(得分:3)
要镜像golang.org给出的示例,Go允许您轻松地将字符串转换为符文切片然后迭代,就像您最初想要的那样:
runes := []rune("Hello, 世界")
for i := 0; i < len(runes) ; i++ {
fmt.Printf("Rune %v is '%c'\n", i, runes[i])
}
当然,我们也可以像这里的其他示例一样使用范围运算符,但这更接近原始语法。在任何情况下,这将输出:
Rune 0 is 'H'
Rune 1 is 'e'
Rune 2 is 'l'
Rune 3 is 'l'
Rune 4 is 'o'
Rune 5 is ','
Rune 6 is ' '
Rune 7 is '世'
Rune 8 is '界'
请注意,由于rune
类型是int32
的别名,因此我们必须使用%c
代替%v
语句中的常用Printf
,或者我们将看到Unicode代码点的整数表示(参见A Tour of Go)。