Как можно оперировать строками?go-17

Базовые операции со строками

В Go существует множество способов работы со строками. Рассмотрим основные:

1. Конкатенация

s1 := "Hello"
s2 := "World"
result := s1 + " " + s2  // "Hello World"

Более эффективный способ для множественного соединения:

var builder strings.Builder
builder.WriteString("Hello")
builder.WriteString(" ")
builder.WriteString("World")
result := builder.String()

2. Получение длины строки

s := "Привет" // кириллица в UTF-8
fmt.Println(len(s))         // 12 байт
fmt.Println(utf8.RuneCountInString(s)) // 6 символов

3. Доступ к символам

s := "Hello"
firstByte := s[0]          // 72 (байт 'H')
firstRune, _ := utf8.DecodeRuneInString(s) // 'H'

Продвинутые операции

4. Сравнение строк

s1 := "abc"
s2 := "abc"
fmt.Println(s1 == s2)  // true
fmt.Println(strings.Compare(s1, s2)) // 0 (эквивалентны)

5. Поиск подстрок

s := "hello world"
fmt.Println(strings.Contains(s, "wo"))  // true
fmt.Println(strings.Index(s, "wo"))     // 6

6. Разделение и соединение

// Разделение
parts := strings.Split("a,b,c", ",") // ["a", "b", "c"]

// Соединение
joined := strings.Join(parts, "-")   // "a-b-c"

7. Триминг и замена

s := "  hello  "
trimmed := strings.TrimSpace(s)      // "hello"
replaced := strings.ReplaceAll(s, "l", "L") // "  heLLo  "

8. Преобразование регистра

s := "Hello"
lower := strings.ToLower(s)  // "hello"
upper := strings.ToUpper(s)  // "HELLO"

9. Форматирование

name := "Alice"
age := 25
s := fmt.Sprintf("%s is %d years old", name, age)

10. Работа с Unicode

s := "日本語"
for i, r := range s {
    fmt.Printf("%d: %c\n", i, r)
}

Конвертация между типами

11. []byte ↔ string

// string -> []byte
data := []byte("hello")

// []byte -> string
s := string([]byte{104, 101, 108, 108, 111})

12. strconv - преобразование с числами

// int -> string
s := strconv.Itoa(42)  // "42"

// string -> int
num, err := strconv.Atoi("42")

Работа с большими строками

Для обработки больших текстов эффективно использовать:

reader := strings.NewReader("Very long text...")
scanner := bufio.NewScanner(reader)
for scanner.Scan() {
    line := scanner.Text()
    // обработка строки
}

Резюмируем

  1. Go предоставляет богатый набор операций со строками в стандартных пакетах
  2. Основные пакеты для работы: strings, strconv, unicode/utf8
  3. Для частых модификаций используйте strings.Builder вместо конкатенации
  4. Помните о разнице между байтами и рунами при работе с Unicode
  5. Для сложных операций используйте преобразование в []byte или []rune
  6. Для обработки больших текстов используйте потоковые методы