логотип PurpleSchool
логотип PurpleSchool

Строки в Golang

Автор

Дмитрий Нечаев

Строки — один из ключевых типов данных в любом языке программирования, и Go (или Golang) не является исключением. В этой статье мы подробно рассмотрим, как работать со строками в Go, начиная с базовых операций, заканчивая особенностями и полезными приёмами.

Основы строк в Go

Строки в Go представляют собой последовательности байтов, которые кодируются в UTF-8. В Go строки являются неизменяемыми (immutable), то есть после создания строка не может быть изменена. Этот подход имеет свои плюсы, например, безопасность и упрощение работы с многопоточными приложениями.

Пример создания строки:

package main

import "fmt"

func main() {
    str := "Привет, Go!"
    fmt.Println(str)
}

В этом примере создается строка "Привет, Go!" и выводится на экран с помощью функции fmt.Println().

Конкатенация строк

Конкатенация — это процесс объединения строк. В Go строки можно объединять с помощью оператора +.

package main

import "fmt"

func main() {
    greeting := "Привет, " + "мир!"
    fmt.Println(greeting)
}

Использование оператора + позволяет легко объединить две строки в одну.

Длина строки

Для получения длины строки в Go используется функция len(), которая возвращает количество байтов в строке.

package main

import "fmt"

func main() {
    str := "Привет"
    fmt.Println(len(str)) // Выводит 12, так как каждый символ занимает несколько байт в UTF-8
}

Важно помнить, что функция len() возвращает количество байтов, а не количество символов. Это связано с тем, что строки в Go кодируются в UTF-8, где один символ может занимать больше одного байта.

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

Для доступа к символам строки можно использовать индексы, однако результатом будет байт, а не руна (символ). Для работы с отдельными символами используется тип rune.

package main

import "fmt"

func main() {
    str := "Привет"
    for i, r := range str {
        fmt.Printf("Индекс: %d, Руна: %c\n", i, r)
    }
}

Здесь range используется для итерации по строке, и каждый символ представлен как rune.

Изменение строк

Строки в Go неизменяемы, поэтому если нужно изменить строку, можно преобразовать её в срез рун или байтов, внести изменения и затем собрать строку обратно.

package main

import "fmt"

func main() {
    str := "Привет"
    runes := []rune(str)
    runes[0] = 'П'
    newStr := string(runes)
    fmt.Println(newStr)
}

В этом примере строка преобразуется в срез рун, модифицируется, а затем преобразуется обратно в строку.

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

Сравнение строк в Go выполняется с помощью операторов == и !=.

package main

import "fmt"

func main() {
    str1 := "Привет"
    str2 := "Мир"
    if str1 == str2 {
        fmt.Println("Строки равны")
    } else {
        fmt.Println("Строки не равны")
    }
}

В этом примере строки str1 и str2 сравниваются, и выводится соответствующее сообщение.

Выводы

Работа со строками в Go достаточно проста, но важно учитывать их особенности, такие как кодировка UTF-8 и неизменяемость. Понимание этих особенностей позволяет писать более эффективный и безопасный код.

Стрелочка влевоSwitch в GoРабота с потоками (stream) в GolangСтрелочка вправо

Все гайды по Golang

Работа с YAML в GolangПреобразование типов в GolangКонвертация структур в JSON в GolangStrconv в GolangИспользование пакета SQLx для работы с базами данных в GolangРазбираемся с SQL в GolangРазделение строк с помощью функции split в GolangSort в GoПоиск и замена строк в Go - GolangИспользование пакета reflect в GolangРабота с PostgreSQL в GoPointers в GolangПарсинг в GoРабота со списками (list) в GolangПреобразование int в string в GolangРабота с числами с плавающей точкой в GolangРабота с полями в GolangИспользование enum в GolangОбработка JSON в GoЧтение и запись CSV-файлов в GolangРабота с cookie в GolangРегистры в GoКэширование данных в GolangПреобразование byte в string в GolangByte в GoИспользование bufio для работы с потоками данных в GolangДобавление данных и элементов (add) в Go
Логирование в Golang. Zap, Logrus, Loki, GrafanaРабота с Docker-контейнерами в GoИспользование pprof в GolangМеханизмы синхронизации в GolangРабота с пакетом S3 в GolangМониторинг Golang приложений с помощью PrometheusОптимизация проектов на GoПаттерны проектирования в GolangМиграции базы данных в GolangОркестрация контейнеров Go с Kubernetes + DockerGjGo Playground и компилятор GolangИспользование go mod init для создания модулей GolangРабота с переменными окружения (env) в GolangКоманда go build в GolangАвтоматизация Golang проектов — CI/CD с GitLab CI и JenkinsОтладка кода в GolangЧтение и использование конфигурации в приложениях на GolangКомпиляция в GolangКак развернуть Go-приложение на облаке AWSАутентификация в Golang
Сетевые протоколы в GoПеременные в GolangЗначения в GolangДженерик %T и его применение в GolangТипы данных в GolangИспользование tls в GolangИспользование tag в структурах GolangSwitch в GoСтроки в GolangРабота с потоками (stream) в GolangSelect в GoРуны в GoРабота с пакетом params в GolangКонвертация строк в числа в GolangNull, Nil, None, 0 в GoНаименования переменных, функций и структур в GoInt в GolangУстановка GolangЧтение и установка HTTP заголовков в GolangMethods в GolangGoLand — IDE для разработки на Golang от JetBrainsОбработка «not found» в GolangFloat в GolangФлаги командной строки в Go (Golang)Запуск внешних команд в GolangОбработка ошибок в GoИспользование defer в GolangЗначения default в GolangГенерация кода в GoФорматирование кода в GolangЧистая архитектура в GolangКаналы (channels) в GolangПолучение body из HTTP запроса в Golang
Открыть базу знаний