2 回答
![?](http://img1.sycdn.imooc.com/5458464a00013eb602200220-100-100.jpg)
TA贡献2051条经验 获得超10个赞
处理它的一种优雅方式(在我看来)是将 getter 添加到用作指针的结构中。这种“技术”也被protobuf生成的 Go 代码使用,它允许方法调用的自然链接,而不必担心由于nil指针导致的运行时恐慌。
在您的示例中,Bar和Baz结构用作指针,因此用 getter 武装它们。重点是添加带有指针接收器的方法,首先必须检查接收器是否为nil。如果是,则返回结果类型的零值。如果没有,继续返回结构的字段:
func (b *Bar) GetBaz() *Baz {
if b == nil {
return nil
}
return b.Baz
}
func (b *Baz) GetBaz() string {
if b == nil {
return ""
}
return b.Baz
}
带有指针接收器的方法的好处是你可以用nil接收器调用它们。它不会导致运行时恐慌,直到您尝试引用它们的字段,而我们不会,这就是为什么我们首先检查接收器是否是nil(最终,接收器充当正常参数 -nil作为指针传递永远不会出错争论)。
有了上面的 getter,使用被简化为这样,并且在任何这些示例中都不会发生运行时恐慌:
fmt.Println(f3.Bar.GetBaz().GetBaz()) // naturally no panic
fmt.Println(f2.Bar.GetBaz().GetBaz()) // No panic
fmt.Println(f1.Bar.GetBaz().GetBaz()) // No panic
if baz := f2.Bar.GetBaz(); baz != nil {
fmt.Println(baz.GetBaz())
} else {
fmt.Println("something nil")
}
在Go Playground上试一试。
- 2 回答
- 0 关注
- 170 浏览
添加回答
举报