Alex.Li
Alex.Li

Reputation: 560

GoLang: panic on call of nil object's method

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

Answers (2)

Christian
Christian

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

I159
I159

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

Related Questions