Назад к вопросам
Middle
103
questionbank
Как устроены строки в языке программирования Go?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Строка в Go — это неизменяемая последовательность байтов.
Ключевые особенности:
- Неизменяемость: после создания строка не может быть изменена.
- Представление: хранится как указатель и длина. Указатель указывает на первый байт последовательности в памяти. Длина — количество байтов.
- Кодировка: строки в Go не несут информации о кодировке. Часто используются для хранения UTF-8, но могут содержать любые байты.
- Итерация по байтам: цикл
for index, value range stringпри итерации по строке возвращает индекс и руну (int32), а не байт. - Итерация по рунам: руна представляет собой Unicode code point. Go использует UTF-8, поэтому одна руна может занимать от 1 до 4 байтов.
- Получение подстроки: операция среза
string[start:end]создает новую строку, указывающую на тот же участок памяти, но с другими границами.
Примеры:
// Объявление и инициализация
var s string
s = "Привет" // String literal в Go - последовательность байтов,
// обычно интерпретируется как UTF-8
// Длина строки в байтах
byteLength := len(s) // 12, так как "П", "р", "и", "в", "е", "т" - многобайтовые символы в UTF-8
// Итерация по рунам
runeCount := 0
for index, runeValue := range s {
// index - индекс начала руны в байтах
// runeValue - значение руны (int32)
_ = index // Использование заглушки _ для неиспользуемой переменной
// fmt.Printf("Index: %d, Rune: %c (U+%04X)\n", index, runeValue, runeValue)
runeCount++
}
// runeCount будет 6
// Итерация по байтам
byteCount := 0
for i := 0; i < len(s); i++ {
// s[i] - байт по индексу i
_ = s[i] // Использование заглушки
// fmt.Printf("Byte at index %d: %d\n", i, s[i])
byteCount++
}
// byteCount будет 12
// Получение подстроки (срез байтов)
// Важно: срез байтов может разорвать многобайтовую руну
// sub := s[0:5] // Это может быть недопустимой UTF-8 последовательностью
// Использование пакета strings или unicode/utf8 для безопасной работы с рунами
Сравнение со срезом байтов ([]byte):
| Характеристика | String | []byte |
|---|---|---|
| Изменяемость | Нет | Да |
| Представление | Указатель + Длина | Указатель + Длина + Емкость |
| Тип | Встроенный примитивный | Срез (slice) |
| Использование | Неизменяемый текст | Изменяемые данные (байты) |
Преобразование между string и []byte:
// string -> []byte
byteSlice := []byte(s)
// []byte -> string
newString := string(byteSlice)