Почему 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: он идёт по символам, а индекс - это позиция первого байта символа.

Подробнее про строки, руны и другие базовые типы: Читать статью на блоге

А вы встречали такие «обрывки букв» в реальных данных?

#golang #go #backend

Почему len("Привет") равен 12 | Сетка — социальная сеть от hh.ru