Все вопросы

10 Типы и значения

Чем строка отличается от набора символов?

Строка в Go — неизменяемая последовательность байт, почти всегда в UTF-8. len(s) считает байты, а не буквы. Буква «Я» занимает два байта, поэтому в "Привет" шесть рун и двенадцать байт.

Цикл for i, r := range s идёт по рунам, а i — это байтовый сдвиг, поэтому индексы будут 0, 2, 4… Чтобы получить срез символов, преобразуй строку к []rune. Чтобы править байты на месте, бери []byte — строку так менять нельзя.

Пример

Go

байты и руны в слове Привет

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))
    }
}