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