如何在Go中循环使用UTF-8字符串?

won*_*ng2 15 go

我有一个中文字符串:

x = "??"
Run Code Online (Sandbox Code Playgroud)

我想循环遍历它并对其中的每个角色做一些事情,例如:

for i, len := 0, len(x); i < len; i++ {
    foo( x[i] ) // do sth.
}
Run Code Online (Sandbox Code Playgroud)

我发现len(x)将返回6而不是2,在Google之后我找到了RuneCountInString返回字符串实际长度的方法,但我仍然不知道如何循环以x[i]获得正确的字符,x[0] == '?'例如..

谢谢

Die*_*Epp 30

使用range.

x = "??"
for _, c := range x {
    // do something with c
}
Run Code Online (Sandbox Code Playgroud)

如果您想要随机访问,则需要使用代码单元索引而不是字符索引.幸运的是,没有充分的理由需要字符索引,因此代码单元索引很好.

大多数语言都有完全相同的问题.例如,Java和C#使用UTF-16,它也是一种可变长度编码(但有些人假装它不是).

有关Go使用UTF-8的原因的详细信息,请参阅UTF-8宣言.