Назад к вопросам
Junior
109
questionbank
Как строки работают в языке Go?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Строки в Go — это неизменяемые последовательности байт. Они представляют собой "байтовый срез" ([]byte) с гарантией неизменяемости.
Ключевые особенности:
- Неизменяемость: После создания строка не может быть изменена. Любая операция, которая кажется модификацией строки, на самом деле создает новую строку.
- Представление: По умолчанию строки в Go представляют UTF-8 закодированный текст. Однако они просто являются последовательностями байт; интерпретация как UTF-8 происходит при работе с рунами.
- Руны: Символы Unicode в Go представлены типом
rune, который является псевдонимом дляint32. Итерация по строке с использованиемrangeавтоматически декодирует UTF-8 и предоставляет руны и их начальные индексы в байте. - Длина: Функции
len(s)возвращает количество байтов в строке, а не количество символов (рун). Для получения количества рун нужно использоватьutf8.RuneCountInString(s)или итерировать по строке сrange. - Конкатенация: Для объединения строк используется оператор
+. Это создает новую строку. Для эффективного объединения большого количества строк рекомендуется использоватьstrings.Builder.
Примеры:
// Объявление строки
str := "Hello, 世界"
// Длина строки (в байтах)
byteLen := len(str) // 13 (H(1)e(1)l(1)l(1)o(1),(1) (1)世(3)界(3))
// Итерация по рунам
runeCount := 0
for index, runeValue := range str {
// index - начальный индекс руны в байте
// runeValue - руна
runeCount++
// fmt.Printf("Index: %d, Rune: %c (Value: %d)\n", index, runeValue, runeValue)
}
// runeCount - количество рун (9)
// Доступ к байту по индексу
// Внимание: это байт, а не символ!
// byteAtIndex := str[0] // 'H'
// byteAtIndex := str[7] // Начальный байт символа '世'
// Конкатенация строк
newStr := str + "!"
// Использование strings.Builder для эффективной конкатенации
// import "strings"
var builder strings.Builder
builder.WriteString("Hello, ")
builder.WriteString("World")
efficientStr := builder.String() // "Hello, World"