Reputation: 560
Deferred function:
func PrintPing(req *proto.PingRequest, resp *proto.PingResponse) {
fmt.Println("resp:", resp)
fmt.Println("resp.GetResult():", resp.GetResult())
}
When this function is called after a panic, the resp
and resp.GetResult()
is nil.
But why resp.GetResult()
is nil too? The console output:
resp: <nil>
resp.GetResult(): <nil>
Is there any official definition for this case?
Upvotes: 1
Views: 1204
Reputation: 3721
I assume your question is why the resp.GetResult() call does not panic itself because it's called on a nil instance.
This is how Go works. The method can be called also on types where the instance is nil. As long as the method itself does not access the instance, it will work and behavior for nil instances can be implemented.
This has nothing to do with deferred functions. It can also be simulated in other contexts: https://play.golang.org/p/qQanhQnIcL
Upvotes: 6
Reputation: 31109
Your proto.PingResponse
is not just nil
but in some manner a typed nil
. In Go terms it is zero value:
Variables declared without an explicit initial value are given their zero value.
It is ok to have access to a method of zero value of type and not panic if the method doesn't do nothing which could cause panic on a zero value.
Upvotes: 1