Что такое относительный адрес
Что проверяют
Понимаете ли вы, как устроена адресация: адрес относительно базы против абсолютного. Для разработчика на Go у вопроса есть второе дно, потому что арифметики указателей в языке нет сознательно, и знание причины важнее определения.
Как отвечать
Относительный адрес это смещение от точки отсчёта: начала сегмента, начала загруженного модуля, текущей инструкции. Абсолютный это позиция в адресном пространстве процесса.
Зачем так делают: код и данные можно загрузить куда угодно. Отсюда позиционно-независимый код, релокация при загрузке, переходы относительно счётчика команд и рандомизация раскладки адресов, которая на каждом запуске кладёт образ по новому месту.
В Go смещения видны, но спрятаны за типами:
- поле структуры адресуется смещением от её начала, узнать его можно через
unsafe.Offsetof, а размер и выравнивание зависят от архитектуры; - срез это тройка из указателя на начало, длины и вместимости, и элемент вычисляется как база плюс индекс, умноженный на размер элемента;
- арифметики указателей в языке нет: выражение вида
ptr + iпросто не компилируется.
Если смещение действительно нужно, работают через unsafe.Pointer и uintptr, но по строгому правилу: преобразование и арифметика должны стоять в одном выражении. Причина в том, что uintptr это обычное число. Оно не удерживает объект от сборщика мусора, а стек горутины растёт перемещением, и сохранённое значение начинает указывать в никуда. Для обхода памяти есть безопасные средства: индексация и unsafe.Slice.
Где спотыкаются
Переносят привычку из C и пишут разыменование суммы указателя и индекса. Код не собирается, и на собеседовании это выглядит как ответ по мотивам другого языка, а не по существу.
Сохраняют uintptr в переменную или поле и возвращаются к нему позже. Тест проходит, на нагрузке приходит порча памяти, которую почти невозможно воспроизвести: всё зависит от того, когда сработал сборщик и рос ли стек.
Смешивают уровни и называют индекс среза адресом. Индекс это логическая позиция, адрес считает компилятор с учётом размера и выравнивания типа, и вручную такие смещения выводить нельзя.