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 это нулевое значение:

Переменные, объявленные без явного начального значения, получают нулевое значение.

Это нормально иметь доступ к методу нулевого значения типа и не паниковать, если метод не делает ничего, что может вызвать панику при нулевом значении.

Другие вопросы по тегам