GoLang: panic on call of nil object's method

1.1k views Asked by At

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?

2

There are 2 answers

0
Christian On BEST ANSWER

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

0
I159 On

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.