return nil, nil 不是惯用的 go 吗?

nmd*_*mdr 0 error-handling idioms go

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

GetCustomer(id string) (*Customer, error)
Run Code Online (Sandbox Code Playgroud)

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

return nil, nil
Run Code Online (Sandbox Code Playgroud)

这在 Go 中被认为是糟糕的编码实践吗?或者惯用的 Go 代码看起来像

 return nil, errCustomerNotFound
Run Code Online (Sandbox Code Playgroud)

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

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

更新

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

Fli*_*mzy 5

return nil, nil在您的情况下是否惯用取决于 a 是否nil *Customer是有用的值。

如果nilfor 的*Customer值在您的代码中是一个正常的、有用的值,那么返回它,没有错误,是有意义的。

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

要遵循的规则:

每个函数都应该返回一组有用的值。

在您的情况下,您返回一个结构指针和一个错误,您可以合理地假设其中一个最多为零。

使用 nil struct 指针来指示值的缺失可能是惯用的,但不能与错误结合使用。如果您的函数只能有一个错误条件“​​未找到”,您可能会选择只返回单个值(可能为零)的函数,或者您可能会选择返回指示存在而不是错误的布尔值。

但是,当还包含错误时返回一个 nil 表示“未找到”充其量是令人困惑的,因为它违反了最少惊讶原则