Какие основные операции доступны для строк в Go?

Ответ

В Go строки — это неизменяемые (immutable) последовательности байт, обычно в кодировке UTF-8. Неизменяемость означает, что любая операция, "модифицирующая" строку, на самом деле создает новую.

Основные операции:

  1. Конкатенация (объединение) Используется оператор + или более эффективная функция strings.Join для множества строк.

    s1 := "Hello"
    s2 := "World"
    result := s1 + " " + s2 // "Hello World"
  2. Получение длины в байтах Функция len() возвращает количество байт, а не символов. Для кириллических символов это важно.

    // Строка "Привет" в UTF-8 занимает 12 байт (6 символов * 2 байта/символ)
    lengthInBytes := len("Привет") // 12
  3. Подсчёт символов (рун) Для корректного подсчета символов в UTF-8 строке используется пакет unicode/utf8.

    import "unicode/utf8"
    
    runeCount := utf8.RuneCountInString("Привет") // 6
  4. Итерирование Цикл for ... range безопасно итерирует по рунам (символам), а не по байтам.

    for index, runeValue := range "Go-руны" {
        fmt.Printf("На позиции %d стоит руна %cn", index, runeValue)
    }
  5. Доступ к байтам и срезы Можно получить байт по индексу или подстроку (срез). Операция среза создает новую строку.

    s := "abcdef"
    b := s[1]      // 98 (байт, соответствующий 'b')
    sub := s[1:4]  // "bcd"
  6. Сравнение Строки можно сравнивать лексикографически с помощью ==, !=, <, >.

    "abc" == "abc" // true
    "a" < "b"    // true
  7. Преобразование типов Строки можно эффективно преобразовывать в срез байт и обратно.

    bytes := []byte("text")
    str := string(bytes)
  8. Пакет strings Для более сложных операций (поиск, замена, разделение, удаление пробелов) используется стандартный пакет strings.

    import "strings"
    
    strings.Contains("hello world", "world") // true
    strings.ReplaceAll("a-b-c", "-", ",") // "a,b,c"

Важно: Для многократного построения строк (например, в цикле) используйте strings.Builder, чтобы избежать лишних аллокаций памяти.