Назад к вопросам
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)