2017-01-09 132 views
0

递延功能:GoLang:恐慌在无对象的方法呼叫

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> 

这种情况下是否有任何官方定义?

回答

5

我假设你的问题是为什么resp.GetResult()调用不会因为它在一个零实例上被调用而自我恐慌。

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

这有什么好做延期功能,它也可以模拟在其他情况下:https://play.golang.org/p/qQanhQnIcL

+0

感谢您的回答,Christian。它与C/C++完全不同:P –

1

proto.PingResponse不仅仅是nil但在某些方式输入nil。在围棋方面,它是零值

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

如果方法没有做任何事情可能导致零值出现恐慌,那么可以访问类型为零值的方法并且不会发生恐慌。

+0

感谢您的回答和更清晰的标题:) –

+0

@ Alex.Li,您好。 – I159