登录
首页 >  Golang >  Go问答

在 Struct 属性中捕获 nil 指针取消引用

来源:stackoverflow

时间:2024-04-25 18:54:32 187浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《在 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)
}

但在这种情况下,如果我想打印出 latitudelat 属性,我必须添加另一个 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学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>