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

Значения в Golang

Автор

Александр Гольцман

Значения в Go

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

Что такое значение в Go?

Смотрите, в Go значение — это конкретное представление данных определенного типа. Когда вы создаёте переменную, ей присваивается значение, соответствующее её типу. Например:

var x int = 10
var name string = "Golang"

Здесь x хранит значение 10 типа int, а name содержит строку "Golang".

Передача значений в Go

Одной из ключевых особенностей Go является передача аргументов в функции по значению. Это означает, что когда вы передаёте переменную в функцию, Go создаёт её копию, а оригинальное значение остаётся неизменным.

Покажу на примере:

func changeValue(num int) {
    num = 20
}

func main() {
    value := 10
    changeValue(value)
    fmt.Println(value) // Выведет 10, так как передача шла по значению
}

Как видите, значение value в main не изменилось, так как changeValue работала с его копией.

Изменяемые и неизменяемые значения

Хотя большинство значений в Go передаются по копии, есть исключения, например, срезы (slice) и карты (map). Они передаются как ссылки на данные, что позволяет изменять их содержимое внутри функций.

Вот пример для наглядности:

func modifySlice(s []int) {
    s[0] = 99
}

func main() {
    nums := []int{1, 2, 3}
    modifySlice(nums)
    fmt.Println(nums) // Выведет [99, 2, 3]
}

Здесь nums изменился, потому что срезы передаются как ссылки на подлежащие данные.

Заключение

Go использует строгую модель работы со значениями: простые типы передаются по копии, а сложные структуры, такие как срезы и карты, передаются как ссылки. Это делает код безопасным и предсказуемым. Обязательно учитывайте эти особенности при разработке, чтобы избежать неожиданных изменений данных!

Стрелочка влевоПеременные в GolangДженерик %T и его применение в 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
Открыть базу знаний