难道return nil, nil 不是地道的走吗?

Is return nil, nil not idiomatic go?

如果我们在GO中有如下方法:

GetCustomer(id string) (*Customer, error)

数据库中可能不存在给定 ID 的客户。当找不到客户时,代码可以

return nil, nil

这在 Go 中被认为是错误的编码习惯吗?或者惯用的 Go 代码看起来像

 return nil, errCustomerNotFound

我在第二种方法中看到的问题是您最终会检查这个特定错误并单独处理它。

Go 源代码或库中是否有出现这种情况的示例以及首选方法之一?

更新

如果return nil, nil被认为是不地道的。我想知道为什么在这种情况下是这样?由于 *Customer 是一个指针,我想 return nil 表示没有值

return nil, nil 是否符合您的情况取决于 nil *Customer 是否有用。

如果 *Customernil 值在您的代码中是正常的、有用的值,那么 return 毫无错误地计算它是有意义的。

尽管 nil 结构指针很少有用——在大多数情况下,仅此一项就可以被认为是非惯用的。

要遵循的规则:

Every function should always return a useful set of values.

在你的例子中,你 return 一个结构指针和一个错误,可以合理地假设其中至多一个是 nil。

使用 nil 结构指针来指示值的缺失 可以 是惯用的,但不能与错误一起使用。如果你的函数只能有一个错误条件 'not found',你可能会选择 return 只有一个值的函数,它可能是零,或者你可以选择 return指示存在而非错误的布尔值。

但是,return将 nil 表示“未找到”,同时还包含一个错误,充其量是令人困惑的,因为它违反了 principle of least astonishment.

如果未达到预期结果,则应 return 编辑错误。例如删除一条记录。删除一条记录,必须先found/retrieved,做一些业务流程检查是否有,如果一切正常则删除。如果未找到记录或中断业务流程,则 return 错误。无论如何,删除不存在的记录是一个错误的请求。

如果请求只是检索不受限制的记录,return如果没有找到则为零。如果请求获取集合,return空array/slice如果找不到。