当前位置: > > > > 在 Struct 属性中捕获 nil 指针取消引用
来源:stackoverflow
2024-04-25 18:54:32
0浏览
收藏
亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《在 Struct 属性中捕获 nil 指针取消引用》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质性的提高。
问题内容
当尝试访问作为另一种类型的地址的结构体的属性时,我试图找到捕获 nil 指针解引用
的最佳方法。
假设我们有这些结构(代码仅供演示。我的目的是传达一个观点)
type location struct { coordinates *coordinates } type coordinates struct { lat *latitude lon *longitude } type latitude struct { lat float64 } type longitude struct { lon float64 }
初始化空位置并访问 loc.coordinates.lat
显然会产生预期的错误
loc := location{} fmt.println(loc.coordinates.lat) // runtime error: invalid memory address or nil pointer dereference
为了解决这个问题我可以做
if loc.coordinates != nil { fmt.println(loc.coordinates.lat) }
但在这种情况下,如果我想打印出 latitude
的 lat
属性,我必须添加另一个 if
语句,如下所示
if loc.coordinates != nil { if(loc.coordinates.lat != nil){ fmt.Println(loc.coordinates.lat.lat) } }
我想知道是否有其他方法可以处理这种情况,而不检查每个地址是否不等于 nil
。 go 中是否有像 val, ok := somemap["foo"]
这样的结构?
正确答案
如果你定义了指针类型,你必须处理它们可能为零的情况。一种方法是检查每个访问。另一种方法是使用可以处理 nil 接收器的 getter:
func (c *Coordinates) GetLat() (Latitude,bool) { if c==nil { return Latitude{}, false } return c.lat,true } func (l *Location) GetCoordinates() *Coordinates { if l==nil { return nil } return l.coordinates } lat, ok:=l.GetCoordinates().GetLat() if ok { // there is a valid lat }
不,没有。 (从生成的恐慌中恢复是一种不好的做法,容易出错且速度缓慢。)
没有。
好了,本文到此结束,带大家了解了《在 Struct 属性中捕获 nil 指针取消引用》,希望本文对你有所帮助!关注公众号,给大家分享更多Golang知识!