Строка в Go — последовательность байт, не символов. Для работы с Unicode используй rune (int32), который представляет один code point.
s := "Привет"
// Побайтово — неправильно для unicode
fmt.Println(len(s)) // 12 (кириллица = 2 байта/символ)
// Посимвольно — правильно
for _, r := range s {
fmt.Printf("%c", r) // range итерирует по рунам
}
// Или через конвертацию
runes := []rune(s)
fmt.Println(len(runes)) // 6 символов
Пакеты unicode/utf8 и strings содержат утилиты для работы с UTF-8. utf8.RuneCountInString(s) возвращает количество символов.