Назад к вопросам
Junior
103
questionbank

Как вы можете работать со строками в языке Go?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

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

Основные способы работы со строками:

  1. Создание:

    // Строковый литерал
    s1 := "Hello, Go!"
    
    // Из слайса байт
    byteArray := []byte{'H', 'e', 'l', 'l', 'o'}
    s2 := string(byteArray)
    
  2. Конкатенация:

    s3 := "World"
    result := s1 + " " + s3 // Использование оператора +
    

    Для большого количества конкатенаций эффективнее использовать strings.Builder:

    import "strings"
    
    var sb strings.Builder
    sb.WriteString("Hello")
    sb.WriteString(", ")
    sb.WriteString("World!")
    result2 := sb.String()
    
  3. Длина:

    • В байтах:
      byteLength := len(s1)
      
    • В символах (рунах):
      runeLength := utf8.RuneCountInString(s1) // Требует импорта "unicode/utf8"
      
  4. Доступ к символам (рунам) и итерация: В Go строки состоят из байт, но при итерации с помощью range они декодируются в руны (кодовые точки Unicode).

    import "fmt"
    
    for index, runeValue := range s1 {
        fmt.Printf("Index: %d, Rune: %c, Type: %T\n", index, runeValue, runeValue)
    }
    

    Прямой доступ по индексу возвращает байт, а не руну:

    b := s1[0] // Возвращает байт 'H'
    
  5. Преобразование:

    • В слайс байт:
      byteSlice := []byte(s1)
      
    • В слайс рун:
      runeSlice := []rune(s1)
      
  6. Пакет strings: Предоставляет множество полезных функций для работы со строками:

    • strings.Contains(s, substr): Проверяет наличие подстроки.
    • strings.HasPrefix(s, prefix): Проверяет наличие префикса.
    • strings.HasSuffix(s, suffix): Проверяет наличие суффикса.
    • strings.Index(s, substr): Поиск первого вхождения подстроки.
    • strings.ReplaceAll(s, old, new): Замена всех вхождений подстроки.
    • strings.Split(s, sep): Разбиение строки по разделителю.
    • strings.Join(a []string, sep string): Объединение слайса строк.
    • strings.ToLower(s): Преобразование к нижнему регистру.
    • strings.ToUpper(s): Преобразование к верхнему регистру.
    • strings.TrimSpace(s): Удаление пробельных символов с начала и конца.
  7. Пакет fmt: Для форматированного вывода и сканирования строк.

  8. Пакет strconv: Для преобразования строк в числовые типы и наоборот.

    import "strconv"
    
    i, err := strconv.Atoi("123") // String to int
    s := strconv.Itoa(i)         // Int to string
    

Неизменяемость строк важна и означает, что любая операция, которая кажется модифицирующей строку (например, конкатенация или Replace), на самом деле создает новую строку.