当前位置: > > > > 在 Struct 属性中捕获 nil 指针取消引用
在 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知识!
