GoLang:调用 nil 对象的方法时出现恐慌

GoLang: panic on call of nil object's method

延迟函数:

func PrintPing(req *proto.PingRequest, resp *proto.PingResponse) {
    fmt.Println("resp:", resp)
    fmt.Println("resp.GetResult():", resp.GetResult())
}

当此函数被调用时在恐慌之后,respresp.GetResult()为零。

但为什么 resp.GetResult() 也是零?控制台输出:

resp: <nil>
resp.GetResult(): <nil>

这个案例有官方定义吗?

我假设你的问题是为什么 resp.GetResult() 调用本身不会恐慌,因为它是在 nil 实例上调用的。

这就是 Go 的工作原理。该方法也可以在实例为 nil 的类型上调用。只要方法本身不访问实例,它就会工作并且可以实现 nil 实例的行为。

这与延迟函数无关。也可以在其他上下文中模拟:https://play.golang.org/p/qQanhQnIcL

您的 proto.PingResponse 不仅是 nil,而且在某种程度上是键入的 nil。在 Go 术语中,它是 零值:

Variables declared without an explicit initial value are given their zero value.

可以访问类型为零值的方法,如果该方法不执行任何可能导致零值恐慌的方法,则不会恐慌。