> Почему программа падает при работе с указателем на структуру и как это связано с арифметикой указателей в Go (Go)
Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: Лига Цифровой Экономики
Стек: Go
> Пример ответа
В Go падение программы при работе с указателем на структуру чаще всего связано с разыменованием nil-указателя или выходом за границы выделенной памяти. Арифметика указателей в Go строго ограничена: в отличие от C, Go не поддерживает произвольные арифметические операции над указателями (например, ptr++ или ptr + offset). Это сделано для безопасности типов и предотвращения неопределённого поведения.
Пример типичной ошибки:
GOtype User struct {Name stringAge int}func main() {var p *User // p == nilp.Age = 25 // panic: runtime error: invalid memory address or nil pointer dereference}
Здесь падение происходит из-за разыменования nil-указателя. В Go указатель на структуру может быть nil, и попытка доступа к полю через такой указатель вызывает панику.
Что касается арифметики указателей: в Go она возможна только через пакет unsafe, что крайне не рекомендуется в обычном коде. Например:
GOimport "unsafe"type Point struct { X, Y int }func main() {p := &Point{1, 2}// unsafe.Pointer позволяет обойти систему типовptr := unsafe.Pointer(p)// Сдвиг на размер int (опасно, зависит от выравнивания)yPtr := (*int)(unsafe.Pointer(uintptr(ptr) + unsafe.Offsetof(p.Y)))*yPtr = 10 // работает, но может привести к падению при неверном смещении}
Использование unsafe может вызвать панику, если смещение вычислено неверно или если структура изменится. В обычном Go арифметика указателей запрещена, поэтому падения из-за неё возникают только при злоупотреблении unsafe. Рекомендуется избегать таких подходов и использовать безопасные ссылки через указатели с проверкой на nil.
> Похожие задачи по Go
В каком формате передаются данные по сети
Можно ли ограничить capacity слайса в Go, чтобы append всегда создавал новый массив
Зачем в Go нужны методы, если есть функции?
Почему вызов метода на nil-указателе в Go не приводит к падению программы, в отличие от Java?
> Похожие задачи по backend
В каком формате передаются данные по сети
Можно ли ограничить capacity слайса в Go, чтобы append всегда создавал новый массив
Зачем в Go нужны методы, если есть функции?
Почему вызов метода на nil-указателе в Go не приводит к падению программы, в отличие от Java?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью