Skip to content

Указатели в Go

Из этой темы ты узнаешь:

  • что такое адреса памяти, значений и указатели;

  • какие есть типы и значения указателя Go;

  • как получить значение указателя и что такое адресуемые значения;

  • какие есть ограничения на указатели в Go.

Хотя Go поглощает многие функции из всех видов других языков, он в основном рассматривается как язык семейства C. Одним из доказательств является то, что Go также поддерживает указатели. Указатели Go и указатели C очень похожи во многих аспектах, но между указателями Go и C есть некоторые различия. Далее мы разберем все виды концепций и деталей, связанных с указателями в Go.

Что такое указатели

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

В отличие от языка C, из соображений безопасности для указателей Go наложены некоторые ограничения. Подробности смотри в следующих главах.

Типы и значения указателя Go

В Go безымянный тип указателя может быть представлен с помощью *T, где T может быть произвольным типом. Тип T называется базовым типом указателя *T.

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

Если базовым типом именованного типа указателя является *T, то базовым типом именованного типа указателя является T.

Два безымянных типа указателя с одним и тем же базовым типом являются одним и тем же типом.

Пример:

Нулевые значения любых типов указателей представлены предварительно объявленным nil. Никакие адреса не сохраняются в нулевых значениях указателя.

Значение типа указателя с базовым типом T может хранить только адреса значений типа T.

Адреса памяти

Адрес памяти означает определенную ячейку памяти в программировании.

Как правило, адрес памяти хранится в виде собственного (целого) слова без знака. Размер собственного слова составляет 4 байта для 32-битных архитектур и 8 байтов для 64-битных архитектур. Таким образом, теоретический максимальный размер пространства памяти составляет 2 32 байта, или 4 ГБ (1 ГБ == 2 30 байт), на 32-разрядных архитектурах и 2 64 байта, или 16 EB (1 EB == 1024 ПБ, 1 ПБ == 1024 ТБ, 1 ТБ == 1024 ГБ) на 64-битных архитектурах.

Адреса памяти часто представляются шестнадцатеричными целочисленными литералами, такими как 0x1234CDEF.

Адреса значений

Под адресом значения понимается начальный адрес сегмента памяти, занимаемого прямой частью значения.

О слове reference

Слово «reference» или «ссылка» указывает на отношение. Например, если значение указателя хранит адрес другого значения, то мы можем сказать, что значение указателя (непосредственно) ссылается на другое значение, а другое значение имеет хотя бы одну ссылку. Использование слова «ссылка» соответствует спецификации Go.

Когда значение указателя ссылается на другое значение, мы также часто говорим, что значение указателя указывает на другое значение.