Материал проходит вычитку — возможны неточности.
Урок 38 из 118

Синтаксис указателей

Аня на ревью оставила комментарий: FileMeta копируется в каждом хендлере каталога, передавайте адрес. Миша перевёл хендлеры на адреса, и тяжёлая структура перестала ходить по функциям целиком.

Главная мысль

указатель — это значение, хранящее адрес другой переменной; три элемента синтаксиса — *T, &x, *p, а разыменование nil-указателя паникует.

Указатель — это значение, которое хранит адрес другой переменной. Если пришёл из Python или Java, прямого аналога под рукой нет: там ссылки есть у всего и неявно, а в Go указатели явные, необязательные, и их нужно писать в типе.

Три элемента синтаксиса

*T — тип «указатель на T», &x — взять адрес переменной x, *p — разыменовать, то есть достать значение по адресу.

Go

*p с левой стороны от присваивания — это та самая переменная size, доступ к ней через адрес. Указатель — способ добраться до чужих данных; сами данные при этом никуда не копируются. Для «Полки» T — это *FileMeta: указатель на запись о файле.

Nil-указатель

Нулевое значение указателя — nil. Неинициализированный указатель ни на что не смотрит:

var meta *FileMeta
fmt.Println(meta) // <nil>

Разыменовать nil нельзя: это паника времени выполнения, а не ошибка компиляции.

var meta *FileMeta
*meta = FileMeta{} // panic: runtime error: invalid memory address or nil pointer dereference

Компилятор не умеет отслеживать, откуда взялся nil: указатель мог остаться неинициализированным, поле структуры могли забыть заполнить, карта могла не содержать ключ, функция могла вернуть nil как признак «не найдено». Поэтому указатели проверяют на nil перед использованием — там, где nil действительно возможен.

В следующем уроке

Вы узнаете:

  • зачем брать адрес слайса *[]int
  • чем указатели Go отличаются от ссылок в Python и Java
Задание · вопросы

Проверьте себя

Вопрос 1 из 3

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

Вопрос 2 из 3

Что произойдёт при разыменовании nil-указателя?

Вопрос 3 из 3

Какие три элемента составляют синтаксис указателей?

Итоги

Указатель — адрес в памяти. &x берёт адрес, *p — значение по адресу. Nil-указатель разыменовывать нельзя.

Наш сайт собирает куки. Чтобы тебе было удобнее им пользоваться. Нажимая на кнопку, ты даёшь разрешение собирать куки