> Почему вызов метода на nil-указателе в Go не приводит к падению программы, в отличие от Java? (Go)
Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: Лига Цифровой Экономики
Стек: Go, Java
> Пример ответа
В Go вызов метода на nil-указателе не вызывает падение, потому что методы в Go - это просто функции с получателем (receiver). Когда вы вызываете метод на nil-указателе, Go передает nil в качестве получателя, и выполнение метода продолжается, если внутри метода нет обращения к полям или методам самого получателя. Например:
GOtype MyStruct struct {Value int}func (m *MyStruct) Print() {fmt.Println("Hello") // работает, так как не использует m}func main() {var s *MyStruct = nils.Print() // выведет "Hello", без паники}
Паника возникнет только если метод попытается разыменовать nil (например, m.Value).
В Java же объекты - это ссылки, и вызов метода на null-ссылке всегда приводит к NullPointerException, потому что JVM пытается найти метод в таблице виртуальных методов объекта, что требует разыменования ссылки. Go обходит это за счет явной передачи получателя как аргумента функции, что делает nil допустимым значением для вызова, если код метода это поддерживает.
> Похожие задачи по Go
Почему программа падает при работе с указателем на структуру и как это связано с арифметикой указателей в Go
Зачем в Go нужны методы, если есть функции?
Можно ли в одном типе миксовать методы с ресиверами по значению и по указателю и хорошо ли это
Где выгодно и безопасно использовать неизменяемые объекты
> Похожие задачи по backend
Почему программа падает при работе с указателем на структуру и как это связано с арифметикой указателей в Go
Зачем в Go нужны методы, если есть функции?
Можно ли в одном типе миксовать методы с ресиверами по значению и по указателю и хорошо ли это
Где выгодно и безопасно использовать неизменяемые объекты
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью