10 Типы и значения
Чем строка отличается от набора символов?
Ответ
Строка в Go — неизменяемая последовательность байт, почти всегда в UTF-8. len(s) считает байты, а не буквы. Буква «Я» занимает два байта, поэтому в "Привет" шесть рун и двенадцать байт.
Подробнее
Цикл for i, r := range s идёт по рунам, а i — это байтовый сдвиг, поэтому индексы будут 0, 2, 4… Чтобы получить срез символов, преобразуй строку к []rune. Чтобы править байты на месте, бери []byte — строку так менять нельзя.
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
s := "Привет"
fmt.Println(len(s))
fmt.Println(utf8.RuneCountInString(s))
for i, r := range s {
fmt.Println(i, string(r))
}
}