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())
}
当此函数被调用时在恐慌之后,resp
和resp.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.
可以访问类型为零值的方法,如果该方法不执行任何可能导致零值恐慌的方法,则不会恐慌。
延迟函数:
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>
这个案例有官方定义吗?
我假设你的问题是为什么 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.
可以访问类型为零值的方法,如果该方法不执行任何可能导致零值恐慌的方法,则不会恐慌。