【发布时间】:2020-11-06 21:44:05
【问题描述】:
如果我们在 GO 中有如下方法:
GetCustomer(id string) (*Customer, error)
给定 ID 的客户可能不存在于数据库中。当没有找到客户时,代码可以
return nil, nil
这在 Go 中被认为是不好的编码习惯吗?还是惯用的 Go 代码看起来像
return nil, errCustomerNotFound
我在第二种方法中看到的问题是,您最终会检查此特定错误并单独处理它。
Go 源代码或库中是否有出现这种情况且首选其中一种方法的示例?
更新
如果return nil, nil 被认为不是惯用的。我想知道为什么在这种情况下这是真的?由于 *Customer 是一个指针,我想返回 nil 表示没有值
【问题讨论】:
-
第三种选择是使用签名
GetCustomer(id string) (c *Customer, ok bool, err error)并使用返回return nil, false, nil。这类似于从可能存在或不存在该键的映射中获取键。 -
...是的,
return nil, nil是不是惯用的 Go。 -
让我重新表述一下:Go 标准库不会在第一个返回值中使用标记值来指示“未找到”错误。在您的第一个示例中,标记值为
nil。 -
为什么 return nil,nil 不是惯用的,特别是在这种情况下?因为它是一个指针,所以我想返回 nil 表示没有值
-
The problem I see with the second approach is that you end up checking for this specific error and handling it seperately.使用标准错误,如 sql.ErrNotFound (或类似的)。未找到的值是客户,这是一个对记录有用的细节,在您的代码中,大多数情况下,应该有足够的上下文来确定它是客户。
标签: go error-handling idioms