延期功能:
func PrintPing(req *proto.PingRequest, resp *proto.PingResponse) {
fmt.Println("resp:", resp)
fmt.Println("resp.GetResult():", resp.GetResult())
}
在恐慌后调用此函数时,resp
和resp.GetResult()
为零。
但为什么resp.GetResult()
也是零呢?控制台输出:
resp: <nil>
resp.GetResult(): <nil>
这个案件有官方定义吗?
答案 0 :(得分:5)
我假设你的问题是为什么resp.GetResult()调用不会因为它在nil实例上调用而引起恐慌。
这是如何工作的,该方法也可以在实例为nil的类型上调用。只要方法本身不访问实例,它就可以工作,并且可以实现nil实例的行为。
这与延迟函数无关,也可以在其他上下文中进行模拟:https://play.golang.org/p/qQanhQnIcL
答案 1 :(得分:1)
您的proto.PingResponse
不仅仅是nil
,而且在某种程度上是nil
。在Go术语中,它是零值:
声明没有明确初始值的变量将被赋予零值。
如果方法没有做任何可能导致零值恐慌的事情,那么可以访问类型为零值的方法,而不是恐慌。