GoLang: паника при вызове метода объекта nil
Отложенная функция:
func PrintPing(req *proto.PingRequest, resp *proto.PingResponse) {
fmt.Println("resp:", resp)
fmt.Println("resp.GetResult():", resp.GetResult())
}
Когда эта функция вызывается после паники, resp
а также resp.GetResult()
ноль
Но почему resp.GetResult()
тоже ноль? Консольный вывод:
resp: <nil>
resp.GetResult(): <nil>
Есть ли официальное определение для этого случая?
2 ответа
Я предполагаю, что ваш вопрос заключается в том, почему вызов resp.GetResult() сам по себе не вызывает паники, потому что он вызывается для нулевого экземпляра.
Вот как работает go, метод может быть вызван также для типов, где экземпляр имеет значение nil. Пока сам метод не обращается к экземпляру, он будет работать и может быть реализовано поведение для нулевых экземпляров.
Это не имеет ничего общего с отложенными функциями, это также может быть смоделировано в других контекстах: https://play.golang.org/p/qQanhQnIcL
Ваш proto.PingResponse
это не просто nil
но в некотором роде типизированный nil
, В терминах Go это нулевое значение:
Переменные, объявленные без явного начального значения, получают нулевое значение.
Это нормально иметь доступ к методу нулевого значения типа и не паниковать, если метод не делает ничего, что может вызвать панику при нулевом значении.