Выбор ответа Middle Строки, байты и руны обновлено

Разворот строки с кириллицей

Вопрос

Почему разворот строки побайтно ломает строку «привет» и как правильно?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: UTF-8 символы разорвутся; разворачивать надо []rune(s). Строки Go это UTF-8 байты; кириллическая буква занимает 2 байта, и при развороте байтов пара переворачивается, получая невалидные последовательности.

Варианты ответа

  1. Побайтно сработает: Go хранит строки в UTF-32
  2. UTF-8 символы разорвутся; разворачивать надо []rune(s)правильный ответ
  3. Нужно перевести строку в []byte, развернуть и вызвать utf8.Valid
  4. Строку развернуть нельзя, только слайс байтов

Разбор

Строки Go это UTF-8 байты; кириллическая буква занимает 2 байта, и при развороте байтов пара переворачивается, получая невалидные последовательности. Работают с рунами: r := []rune(s), разворот, string(r). UTF-32 Go не использует. utf8.Valid лишь проверит, что получилась ерунда. Ограничение: составные эмодзи и буквы с комбинируемыми знаками и рунами разорвутся.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.