Этот пост предназначен для программистов, которые приходят на Go и не знакомы с идеей указателей или типа указателя в Go.

Что это за переменная?

Прежде чем говорить об указателе в Go, давайте сначала разберемся, что такое переменная. Вообще говоря, когда мы пишем программу, нам нужно хранить некоторые данные или информацию в памяти. Данные хранятся в памяти по определенному адресу. Адреса памяти часто представлены шестнадцатеричными целочисленными литералами, например 0x1234CDEF.

Теперь нам нужно узнать адрес, по которому он хранится. Мы можем отслеживать все адреса памяти, где хранятся данные, относящиеся к нашей программе. Но представьте, как сложно запомнить все эти адреса памяти, чтобы обращаться к данным с их помощью.

Вот почему у нас есть понятие переменных.

Переменная - просто удобное имя, присвоенное области памяти, в которой хранятся данные.

Что такое указатель?

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

На изображении выше указатель p содержит значение 0x0001, которое является адресом переменной a. И символы *, &, обозначенные как описание на изображении ниже, запомните это

Зачем нужны указатели?

Давайте сначала рассмотрим пример

Ожидается, что функция double в приведенном выше примере изменит входной аргумент, удвоив его. Однако это не удается. Почему? Поскольку все присвоения значений, включая передачу аргументов функции , являются копированием значений. То, что изменила функция double, - это копия x переменной a, но не переменной a

Одно из решений исправить указанную выше двойную функцию - позволить ей возвращать результат модификации. Это решение не всегда работает для всех сценариев. В следующем примере показано другое решение с использованием параметра указателя.

Мы можем обнаружить, что, изменив параметр на тип указателя, переданный аргумент указателя & a и его копия x, используемые в теле функции, ссылаются на одно и то же значение, поэтому модификация * x эквивалентна модификации * p, также известной как переменная a. Другими словами, изменение в Теперь тело функции double может быть отражено за пределами функции.

Конечно, изменение копии самого аргумента переданного указателя все еще не может быть отражено в аргументе переданного указателя. После второго вызова функции double локальный указатель p не изменяется на nil.

TL;DR

Короче говоря, указатели предоставляют косвенные способы доступа к некоторым значениям. Многие языки не имеют понятия указателя. Однако, указатели просто скрыты под другими понятиями в этих языках

Ссылка ссылка