Sobes.tech
Back to questions
Intern
188
questionbank

Что такое тип данных string в языке Go и как он используется?

Sobes Copilot

Get answers in real time

Answer from AI

sobes.tech AI

Тип данных string в Go представляет собой неизменяемую последовательность байт. В Go строки обрабатываются как слайсы байт, но с дополнительной гарантией неизменяемости.

Ключевые особенности:

  • Неизменяемость: После создания строка не может быть изменена. Любая операция, которая выглядит как модификация строки, на самом деле создает новую строку.
  • UTF-8 кодировка: Go по умолчанию использует UTF-8 для строк, что позволяет удобно работать с текстом на разных языках. Отдельные символы в строке (руны) могут занимать разное количество байт.
  • Последовательность байт: Строка — это последовательность байт. Доступ по индексу s[i] возвращает байт, а не руну. Для работы с рунами необходимо использовать []rune(s) или цикл for range s.
  • Длина: Встроенная функция len(s) возвращает количество байт в строке, а не количество символов (рун).
  • Синтаксис литералов: Строковые литералы заключаются в двойные кавычки "..." или обратные кавычки для "сырых" строк \...``.

Использование:

// Объявление и инициализация
var s1 string = "hello"
s2 := "world"

// Конкатенация
s3 := s1 + " " + s2 // Создается новая строка

// Длина в байтах
byteLength := len(s3) // Количество байт

// Итерация по рунам
for i, r := range s3 {
	// i - индекс начала руны в байтах
	// r - руна (тип rune, который является псевдонимом int32)
	//fmt.Printf("Index: %d, Rune: %c, Type: %T\n", i, r, r)
}

// Преобразование в слайс байт
byteSlice := []byte(s3)

// Преобразование в слайс рун
runeSlice := []rune(s3) // Удобно для работы с отдельными символами

// Доступ к байту по индексу (не руне!)
firstByte := s3[0] // byte 'h'

// Срез строки
substring := s3[6:] // Создается новая строка "world"

// Сравнение строк
if s1 == "hello" {
	// Сравнение по содержимому
}