GoLang:对nil对象方法的调用感到恐慌

时间:2017-01-09 11:33:23

标签: go panic

延期功能:

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>

这个案件有官方定义吗?

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:1)

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

  

声明没有明确初始值的变量将被赋予零值。

如果方法没有做任何可能导致零值恐慌的事情,那么可以访问类型为零值的方法,而不是恐慌。