Теория
Указатель — местоположение в памяти, где хранится значение.
Значение указателя — адрес переменной.
Таким образом, с помощью указателя можно считывать (разыменовывать указатель) и изменять значение переменной косвенно, не юзая имя переменной.
Главное — понять, зачем поинтеры нужны. Use case-ы помогут в этом.
Use cases
Side effect
Так происходит потому, что в функцию в виде аргумента передается копия переменной, а не сама переменная, ибо
x
находится в пределахmain()
.
А в случае с указателями, в виде аргумента функции передается адрес значения в памяти, что дает возможность функции “грубо” изменить значение по адресу в памяти.
Экономия памяти
Будь x
примере выше типом данных посложнее, типа, структурой, массивом и т.д. — передача параметров по значению (с помощью переменной) было бы неэффективно из-за копирования значения и выделения под него памяти.
Проверка на пустое значение
wallet := 0
вернул быtrue
, поэтому именно указатели применими для таких случаев.
Пока указатель не указывает на перменную, он равенnil
.
Package flag
Пакет flag использует указатели в качестве ключей.
- Переменные
n
иsep
— это указатели на переменные-флаги, доступ к которым осуществляется косвенно с помощью*n
и*sep
. flag.Parse()
присваивает значение созданным переменнымn
иsep
— только после этого можно использовать флаги в программе.flag.Parse()
при ошибке выкидываетos.Exit(2)
.- Аргументы, не являющиеся флагами, доступны через
flag.Args()
как срез строк[]string
.
new() function
Выражение new(T)
:
- Создает неименованную переменную типа
T
- Инициализирует ее нулевым значением
- Возвращает ее адрес
Проще говоря,
new(T)
создает указатель на нулевое значение указанного типа.
new()
является просто синтаксическим удобством. Наглядно — две идентичные по поведению функции:
new()
для переменных структурных типовВ общем,
new()
используется относительно редко, ибо наиболее распространены неименованные переменные структурных типов, для которых есть более гибкий литеральный синтаксис.
Пример с указателями (ибо работа со структурами часто именно через них и выполняется):что эквивалентно:
Соус: Книга Язык программирования Go → Глава 4. Составные типы → 4.4 Структуры → 4.4.1 Структурные литералы
Соус: Книга Язык программирования Go → Глава 2. Структура программы → 2.3 Переменные → 2.3.3 Функция new
Соусы:
- Mr. YouTube 🤵 (1, 2, 3)
- Книга Язык программирования Go → Глава 2. Структура программы → 2.3 Переменные → 2.3.2 Указатели