> Почему программа падает при работе с указателем на структуру и как это связано с арифметикой указателей в Go (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Лига Цифровой Экономики

Стек: Go

> Пример ответа

В Go падение программы при работе с указателем на структуру чаще всего связано с разыменованием nil-указателя или выходом за границы выделенной памяти. Арифметика указателей в Go строго ограничена: в отличие от C, Go не поддерживает произвольные арифметические операции над указателями (например, ptr++ или ptr + offset). Это сделано для безопасности типов и предотвращения неопределённого поведения.

Пример типичной ошибки:

GO
type User struct {
Name string
Age int
}
func main() {
var p *User // p == nil
p.Age = 25 // panic: runtime error: invalid memory address or nil pointer dereference
}

Здесь падение происходит из-за разыменования nil-указателя. В Go указатель на структуру может быть nil, и попытка доступа к полю через такой указатель вызывает панику.

Что касается арифметики указателей: в Go она возможна только через пакет unsafe, что крайне не рекомендуется в обычном коде. Например:

GO
import "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.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью