12 вопросов
Строки в Go - это неизменяемые последовательности байт в UTF-8. Понимание разницы между byte и rune критически важно для корректной работы с Unicode и кириллицей.
rune в Go? 🟢 Лёгкий
▶
rune = int32. Представляет Unicode code point - один символ Unicode. Не путать с byte (uint8), который представляет один байт. Кириллическая буква - одна rune, но 2 байта в UTF-8.
Подробнее →s[0] = 'A'? 🟢 Лёгкий
▶
Строки в Go иммутабельны (immutable). Нельзя изменить отдельный байт. Чтобы изменить строку, нужно преобразовать её в []byte или []rune, внести изменения и преобразовать обратно в string.
Подробнее →Строки в обратных кавычках - raw string literals. В них не обрабатываются escape-последовательности (\n, \t). Удобно для регулярных выражений, путей, многострочных строк.
Подробнее →strings.Contains("Go is great", "go")? 🟢 Лёгкий
▶
Поиск регистрозависимый. "go" ≠ "Go". Для регистронезависимого поиска используйте strings.Contains(strings.ToLower(s), "go") или strings.EqualFold для сравнения.
Подробнее →Строки в Go иммутабельны - s[0] = 'a' не скомпилируется. Для изменения: конвертировать в []byte (для ASCII) или []rune (для Unicode), изменить, конвертировать обратно. Иммутабельность позволяет безопасно передавать строки между горутинами.
Подробнее →strings.Builder выделяет буфер и наращивает без лишних аллокаций. + создаёт новую строку на каждой итерации (O(n^2) по памяти). strings.Join эффективен, если строки уже в слайсе. Builder.Grow(n) заранее выделяет память, если известен итоговый размер.
Подробнее →len([]rune("Привет"))? 🟡 Средний
▶
Преобразование []rune("Привет") создаёт слайс рун (символов Unicode). Слово "Привет" содержит 6 символов, поэтому len() вернёт 6. Сравните: len("Привет") вернёт 12 (байт).
Подробнее →string(65)? 🟡 Средний
▶
string(65) преобразует число (Unicode code point) в строку из одного символа. 65 - это код символа "A" в Unicode/ASCII. Чтобы получить строку "65", нужно использовать strconv.Itoa(65).
Подробнее →for i, c := range "hello"? 🟡 Средний
▶
При итерации по строке через range, i - индекс байта (int), а c - символ типа rune (int32). Go автоматически декодирует UTF-8 и возвращает Unicode code points.
Подробнее →strings.Builder использует внутренний буфер и минимизирует аллокации. Оператор + создаёт новую строку при каждой конкатенации (O(n²) по памяти). strings.Builder - идиоматический способ для Go.
Подробнее →strings.Cut("host:8080", ":")? 🟡 Средний
▶
strings.Cut (Go 1.18) разрезает строку по первому вхождению разделителя: (before, after, found). before = "host", after = "8080", found = true. Чистая альтернатива strings.Index + срезам.
Подробнее →s := "Го"; s[0]? 🔴 Сложный
▶
Индексирование строки s[0] возвращает байт (uint8), не символ. Буква Г кодируется в UTF-8 двумя байтами: 208, 147. s[0] = 208. Для доступа к символам используйте []rune(s)[0] или итерацию через for range.
Подробнее →