Синтаксис указателей
Аня на ревью оставила комментарий: FileMeta копируется в каждом хендлере каталога, передавайте адрес. Миша перевёл хендлеры на адреса, и тяжёлая структура перестала ходить по функциям целиком.
указатель — это значение, хранящее адрес другой переменной; три элемента синтаксиса — *T, &x, *p, а разыменование nil-указателя паникует.
Указатель — это значение, которое хранит адрес другой переменной. Если пришёл из Python или Java, прямого аналога под рукой нет: там ссылки есть у всего и неявно, а в Go указатели явные, необязательные, и их нужно писать в типе.
Три элемента синтаксиса
*T — тип «указатель на T», &x — взять адрес переменной x, *p — разыменовать, то есть достать значение по адресу.
Что здесь показано
- Стек — локальные переменные функции.
i = 3— значение;p = ptr → 10— указатель на значение;b = "hello"— срез (заголовок: указатель + длина + ёмкость). - Куча — данные, на которые ссылаются переменные:
rodata— байты строки-литерала (в бинарнике),данные N Б— бэкинг-массив слайса,строка— динамическая строка. - Горутины — лёгкие потоки Go: статус (running/runnable/waiting…), функция, в которой каждая сейчас находится, размер стека (растёт по мере работы) и пометка «из main» — горутина запущена из твоего кода.
- GC — сборщик мусора: фаза (off/mark) и число завершённых циклов.
*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
Проверьте себя
Что такое указатель в Go?
Что произойдёт при разыменовании nil-указателя?
Какие три элемента составляют синтаксис указателей?
правильных ответов
Указатель — адрес в памяти. &x берёт адрес, *p — значение по адресу. Nil-указатель разыменовывать нельзя.
10 000 ₽ · 60 минут · онлайн