Перебор строки с Unicode‑символом с помощью range

range выдаст руны B, o, a, t, пробел и 🛶 с байтовыми индексами 0–5. Первая строка печатает саму строку, не её длину.

Короткий ответ

Что ответить на собеседовании

range выдаст руны B, o, a, t, пробел и 🛶 с байтовыми индексами 0–5. Первая строка печатает саму строку, не её длину.

Подробный разбор

Ответ с пояснениями

Условие

Определите, какие строки появятся в выводе, когда пройтись по строке, содержащей Unicode‑символ, используя цикл range.

func main() {
  str := "Boat 🛶"
  fmt.Println("length of string?", str)

  for i, r := range str {
    fmt.Printf("Position %d of '%s'\n", i, string(r))
  }
}

Ответ

range выдаст руны B, o, a, t, пробел и 🛶 с байтовыми индексами 0–5. Первая строка печатает саму строку, не её длину.

Вывод:

length of string? Boat 🛶
Position 0 of 'B'
Position 1 of 'o'
Position 2 of 'a'
Position 3 of 't'
Position 4 of ' '
Position 5 of '🛶'

Индекс в range по string — смещение начала руны в UTF-8, а не порядковый номер символа. Здесь эмодзи стоит последним и занимает четыре байта: len(str) равен 9, число рун — 6. Чтобы напечатать длину в байтах, надо передать len(str), а не str.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее