Database 未找到实体时的正确错误处理

Database 未找到实体时的正确错误处理,database,go,error-handling,Database,Go,Error Handling,我正在编写一个Go应用程序,它有一个数据库包。现在,在数据库包中有两种方法,您可以调用它们来基于某些字段获取实体 我想知道当找不到实体时,Go中错误处理的最佳实践是什么。我应该在自己的数据库包中返回错误,还是返回nil作为值 我知道google的数据存储在找不到实体时返回错误 现在我使用的是gorm,当找不到实体时,它也会返回错误 我想知道您是否可以简单地返回nil作为值,而不是返回错误。我是否遗漏了一点?如果您使用的是gorm,则有一个专门用于此的函数;即 // IsRecordNotFoun

我正在编写一个Go应用程序,它有一个数据库包。现在,在数据库包中有两种方法,您可以调用它们来基于某些字段获取实体

我想知道当找不到实体时,Go中错误处理的最佳实践是什么。我应该在自己的数据库包中返回错误,还是返回nil作为值

我知道google的数据存储在找不到实体时返回错误

现在我使用的是
gorm
,当找不到实体时,它也会返回错误


我想知道您是否可以简单地返回
nil
作为值,而不是返回错误。我是否遗漏了一点?

如果您使用的是
gorm
,则有一个专门用于此的函数;即

// IsRecordNotFoundError returns true if error contains a RecordNotFound error
func IsRecordNotFoundError(err error) bool {}
您可以按如下方式使用它:

err = db.Find(object).Error
if err != nil {
    if gorm.IsRecordNotFoundError(err) {
        // handle object not found
    } else {
        return err
    }
}
关于你的问题:


我想知道您是否可以简单地返回nil作为值,而不是返回错误

这真的取决于你的设计;因此,如果要分离数据库层,则仍应使用您自己导出的错误类型通知用户此错误,并让他们按照自己的意愿处理此错误。

您可以使用以下代码:

  user:=&User{}
  if db.First(&user, "username=?", mobile).RecordNotFound() {
     return nil
  }
  return user

这里没有“最佳实践”。只有意见。做对应用程序有意义的事情。“可以简单地将nil作为值返回,而不是返回错误”?是的,从语法上讲,如果返回类型是指针类型,
nil
是该类型的有效值。至于你是否应该,这完全是基于意见。
gorm.IsRecordNotFoundError
现在被删除。看看这个: