Skip to content

Указатели в Go: зачем они нужны

Сначала рассмотрим пример на скриншоте.

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

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

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

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

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