range выдаст руны B, o, a, t, пробел и 🛶 с байтовыми индексами 0–5. Первая строка печатает саму строку, не её длину.
Перебор строки с Unicode‑символом с помощью range
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.