Строки и руны

12 вопросов

Строки в Go - это неизменяемые последовательности байт в UTF-8. Понимание разницы между byte и rune критически важно для корректной работы с Unicode и кириллицей.

1 Что такое rune в Go? 🟢 Лёгкий
Ответ: B) Алиас для int32

rune = int32. Представляет Unicode code point - один символ Unicode. Не путать с byte (uint8), который представляет один байт. Кириллическая буква - одна rune, но 2 байта в UTF-8.

Подробнее →
2 Можно ли изменить символ строки по индексу: s[0] = 'A'? 🟢 Лёгкий
Ответ: B) Нет, строки неизменяемы

Строки в Go иммутабельны (immutable). Нельзя изменить отдельный байт. Чтобы изменить строку, нужно преобразовать её в []byte или []rune, внести изменения и преобразовать обратно в string.

Подробнее →
3 Что такое raw string literal в Go? 🟢 Лёгкий
Ответ: B) `hello`

Строки в обратных кавычках - raw string literals. В них не обрабатываются escape-последовательности (\n, \t). Удобно для регулярных выражений, путей, многострочных строк.

Подробнее →
4 Что вернёт strings.Contains("Go is great", "go")? 🟢 Лёгкий
Ответ: B) false

Поиск регистрозависимый. "go" ≠ "Go". Для регистронезависимого поиска используйте strings.Contains(strings.ToLower(s), "go") или strings.EqualFold для сравнения.

Подробнее →
5 Можно ли изменить отдельный символ в строке Go? 🟢 Лёгкий
Ответ: B) Нет, нужно конвертировать в []byte или []rune

Строки в Go иммутабельны - s[0] = 'a' не скомпилируется. Для изменения: конвертировать в []byte (для ASCII) или []rune (для Unicode), изменить, конвертировать обратно. Иммутабельность позволяет безопасно передавать строки между горутинами.

Подробнее →
6 Как наиболее эффективно склеить множество строк в цикле? 🟢 Лёгкий
Ответ: C) strings.Builder

strings.Builder выделяет буфер и наращивает без лишних аллокаций. + создаёт новую строку на каждой итерации (O(n^2) по памяти). strings.Join эффективен, если строки уже в слайсе. Builder.Grow(n) заранее выделяет память, если известен итоговый размер.

Подробнее →
7 Что вернёт len([]rune("Привет"))? 🟡 Средний
Ответ: B) 6

Преобразование []rune("Привет") создаёт слайс рун (символов Unicode). Слово "Привет" содержит 6 символов, поэтому len() вернёт 6. Сравните: len("Привет") вернёт 12 (байт).

Подробнее →
8 Что вернёт string(65)? 🟡 Средний
Ответ: B) "A"

string(65) преобразует число (Unicode code point) в строку из одного символа. 65 - это код символа "A" в Unicode/ASCII. Чтобы получить строку "65", нужно использовать strconv.Itoa(65).

Подробнее →
9 Какой тип у элемента при итерации for i, c := range "hello"? 🟡 Средний
Ответ: B) rune

При итерации по строке через range, i - индекс байта (int), а c - символ типа rune (int32). Go автоматически декодирует UTF-8 и возвращает Unicode code points.

Подробнее →
10 Как эффективно склеить много строк? 🟡 Средний
Ответ: B) strings.Builder

strings.Builder использует внутренний буфер и минимизирует аллокации. Оператор + создаёт новую строку при каждой конкатенации (O(n²) по памяти). strings.Builder - идиоматический способ для Go.

Подробнее →
11 Что вернёт strings.Cut("host:8080", ":")? 🟡 Средний
Ответ: A) "host", "8080", true

strings.Cut (Go 1.18) разрезает строку по первому вхождению разделителя: (before, after, found). before = "host", after = "8080", found = true. Чистая альтернатива strings.Index + срезам.

Подробнее →
12 Какой тип и значение у выражения s := "Го"; s[0]? 🔴 Сложный
Ответ: B) byte (uint8), первый байт UTF-8 (208)

Индексирование строки s[0] возвращает байт (uint8), не символ. Буква Г кодируется в UTF-8 двумя байтами: 208, 147. s[0] = 208. Для доступа к символам используйте []rune(s)[0] или итерацию через for range.

Подробнее →
🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.