Как пропустить строку UTF-8 в Go?

У меня есть строка на китайском языке:

x = "你好"

Я хотел бы пропустить его и сделать что-то с каждым персонажем в нем, например:

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

Я обнаружил, что len(x) вернет 6 вместо 2, после того, как Google найду метод RuneCountInString, который вернет реальную длину строки, но я до сих пор не знаю, как сделать цикл make x[i] получить правильный символ, x[0] == '你' например..

Спасибо

Ответы

Ответ 1

Используйте range.

x = "你好"
for _, c := range x {
    // do something with c
}

Если вам нужен произвольный доступ, вам нужно будет использовать индексы единиц кода, а не индексы символов. К счастью, нет веских оснований для необходимости индексирования символов, поэтому индексы кодовых единиц прекрасны.

В большинстве языков есть одна и та же проблема. Например, Java и С# используют UTF-16, который также является кодировкой переменной длины (но некоторые люди притворяются, что это не так).

Подробнее о том, почему Go использует UTF-8, см. UTF-8 Manifesto.