🐹 Go

Строки и работа с текстом в Go 1.21: подробное руководство

Строки и работа с текстом в Go

Введение: Зачем нам работать с текстом?

В программировании мы постоянно имеем дело с текстом: названия NFT-токенов, хештеги в соцсетях, тексты песен, статьи для блога, сообщения для подписчиков. Компьютер хранит текст как последовательность символов. В языке Go для этого существует специальный тип данных — string (строка).

Строки можно сравнивать, соединять, разрезать на части, искать в них символы и слова, переворачивать. В этом разделе мы научимся всем этим операциям на примерах из жизни: как SMM-менеджер, блогер или техноблогер.

Основной синтаксис

1. Что такое строка?

Строка — это набор символов, заключённых в двойные кавычки " ".

package main

import "fmt"

func main() {
    // Объявляем строки
    var название string = "SuperGadget X"
    хештег := "#ЛучшийДеньДляПрограммирования"
    
    fmt.Println(название)
    fmt.Println(хештег)
}

Вывод:

SuperGadget X
#ЛучшийДеньДляПрограммирования

2. Длина строки

Чтобы узнать, сколько символов в строке, используем встроенную функцию len().

package main

import "fmt"

func main() {
    текстПесни := "Hello, world!"
    длина := len(текстПесни)
    fmt.Println("Длина строки:", длина)
}

Вывод:

Длина строки: 13

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

3. Срез строки (получение части)

Мы можем взять часть строки — это называется срез (slice). Используем квадратные скобки с индексами: строка[начало:конец]. Нумерация символов начинается с 0.

package main

import "fmt"

func main() {
    хештег := "#ЛучшийДеньДляПрограммирования"
    // Берём первые 10 символов (индексы с 0 по 9)
    часть := хештег[:10]
    fmt.Println("Часть хештега:", часть)
    
    // Берём с 5-го символа до конца
    сПятого := хештег[5:]
    fmt.Println("С 5-го символа:", сПятого)
    
    // Берём символы с 3 по 7
    отрезок := хештег[3:8]
    fmt.Println("Отрезок:", отрезок)
}

Вывод:

Часть хештега: #ЛучшийД
С 5-го символа: йДеньДляПрограммирования
Отрезок: чший

4. Соединение строк (конкатенация)

Строки можно складывать с помощью знака +.

package main

import "fmt"

func main() {
    первая := "Привет, "
    вторая := "мир!"
    результат := первая + вторая
    fmt.Println(результат)
    
    // Можно сразу соединять несколько
    полное := "Я " + "люблю " + "Go!"
    fmt.Println(полное)
}

Вывод:

Привет, мир!
Я люблю Go!

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

Чтобы проверить, содержит ли строка другую строку, используем функцию strings.Contains(). Для этого нужно подключить пакет strings.

package main

import (
    "fmt"
    "strings"
)

func main() {
    статья := "SuperGadget X — это лучший гаджет года!"
    // Ищем слово "лучший"
    естьЛи := strings.Contains(статья, "лучший")
    fmt.Println("Содержит 'лучший':", естьЛи)
    
    // Ищем слово "плохой"
    естьЛиПлохой := strings.Contains(статья, "плохой")
    fmt.Println("Содержит 'плохой':", естьЛиПлохой)
}

Вывод:

Содержит 'лучший': true
Содержит 'плохой': false

6. Разделение строки на слова

Функция strings.Split() разбивает строку на части по разделителю (например, по пробелу).

package main

import (
    "fmt"
    "strings"
)

func main() {
    текстПесни := "Это лучшая песня в мире"
    слова := strings.Split(текстПесни, " ")
    fmt.Println("Количество слов:", len(слова))
    fmt.Println("Список слов:", слова)
}

Вывод:

Количество слов: 5
Список слов: [Это лучшая песня в мире]

Разбор типичных задач

Задача 1: Хештег (SMM-менеджер)

Условие: Дан длинный хештег, например #ЛучшийДеньДляПрограммирования. Нужно взять только первые 10 символов (без решётки).

package main

import "fmt"

func main() {
    хештег := "#ЛучшийДеньДляПрограммирования"
    // Убираем первый символ (#) и берём следующие 10
    часть := хештег[1:11] // с 1 по 10 (включительно)
    fmt.Println("Короткий хештег:", часть)
}

Вывод:

Короткий хештег: ЛучшийДен

Задача 2: Количество слов в песне

Условие: Дан текст песни. Нужно подсчитать количество слов (слова разделены пробелами).

package main

import (
    "fmt"
    "strings"
)

func main() {
    текстПесни := "Мы едем, едем, едем в далёкие края"
    слова := strings.Split(текстПесни, " ")
    количество := len(слова)
    fmt.Println("Количество слов в песне:", количество)
}

Вывод:

Количество слов в песне: 7

Задача 3: Заключительная часть статьи

Условие: Есть длинная статья. Нужно взять последние 50 символов (заключение).

package main

import "fmt"

func main() {
    статья := "SuperGadget X имеет потрясающий дизайн. Он работает быстро и надёжно. Рекомендую всем!"
    длина := len(статья)
    // Берём последние 20 символов
    заключение := статья[длина-20:]
    fmt.Println("Заключение статьи:", заключение)
}

Вывод:

Заключение статьи:  Рекомендую всем!

Задача 4: Обратное сообщение (блогер)

Условие: Нужно перевернуть строку задом наперёд.

package main

import "fmt"

func main() {
    сообщение := "Привет, подписчики!"
    перевернутое := ""
    // Проходим по строке с конца в начало
    for i := len(сообщение) - 1; i >= 0; i-- {
        перевернутое += string(сообщение[i])
    }
    fmt.Println("Оригинал:", сообщение)
    fmt.Println("Перевёрнуто:", перевернутое)
}

Вывод:

Оригинал: Привет, подписчики!
Перевёрнуто: !икичсдипдоп ,тевирП

Частые ошибки новичков

  • Забывают, что индексы начинаются с 0. Первый символ — это строка[0], а не строка[1].
  • Выход за границы строки. Если строка длиной 10 символов, то последний индекс — 9. Обращение к строка[10] вызовет ошибку.
  • Путают len() с количеством символов для кириллицы. Для русского текста len() показывает количество байт, а не букв. Для простых задач это не критично, но помните об этом.
  • Забывают импортировать пакет strings. Функции strings.Contains, strings.Split доступны только после добавления import "strings".
  • Пытаются изменить символ в строке. Строки в Go неизменяемы. Нельзя написать строка[0] = 'A'. Нужно создавать новую строку.

Итоговый пример: NFT-токен

Представь, что ты создаёшь NFT-коллекцию. Название токена — "CosmicCat #007". Нужно проверить, что название содержит слово "Cat", взять первые 5 символов для превью и вывести всё в обратном порядке.

package main

import (
    "fmt"
    "strings"
)

func main() {
    название := "CosmicCat #007"
    
    // 1. Проверяем, содержит ли "Cat"
    содержитКота := strings.Contains(название, "Cat")
    fmt.Println("Содержит 'Cat':", содержитКота)
    
    // 2. Берём первые 5 символов для превью
    превью := название[:5]
    fmt.Println("Превью:", превью)
    
    // 3. Переворачиваем название
    перевернутое := ""
    for i := len(название) - 1; i >= 0; i-- {
        перевернутое += string(название[i])
    }
    fmt.Println("Оригинал:", название)
    fmt.Println("Перевёрнутое название:", перевернутое)
}

Вывод:

Содержит 'Cat': true
Превью: Cosmic
Оригинал: CosmicCat #007
Перевёрнутое название: 700# taCcimsoc

Теперь ты готов работать с текстом как настоящий программист! Помни: строки — это просто последовательность символов, и с ними можно делать всё что угодно: резать, склеивать, искать и переворачивать. Удачи в решении задач!