Почему len("Привет") равен 12
len("Привет") в Go возвращает 12. Простой вопрос, на котором на собеседованиях проверяют, понимает ли человек, как устроены строки.
Строка в Go - последовательность байтов в UTF-8. Латинская буква - 1 байт, кириллица - 2, большинство эмодзи - 4. len считает байты, а не символы.
Где это важно на практике - обрезка строк. name[:9] для «Stanislav» даёт всё имя, а для «Станислав» - четыре буквы и обрывок пятой. Такой обрывок потом всплывает знаком вопроса в интерфейсе, в логах или в базе.
Как правильно: - считать символы - utf8.RuneCountInString(s) или len([]rune(s)); - обрезать - через []rune: string([]rune(s)[:n]); - перебирать - for range: он идёт по символам, а индекс - это позиция первого байта символа.
Подробнее про строки, руны и другие базовые типы: Читать статью на блоге
А вы встречали такие «обрывки букв» в реальных данных?