【发布时间】:2022-02-02 03:03:23
【问题描述】:
我在 Go 中有一个带有这个签名的函数:
func GetAccount(ctx context.Context, id uuid.UUID) (*Account, error)
如果出现内部错误(例如数据库查询由于某种原因失败),它会返回一个错误,但如果找不到帐户,我不确定应该返回什么。我可以想到两种不同的方法:
- 只返回一个 nil 帐户,如果没有找到帐户则返回 nil 错误
- 返回自定义错误类型,如下所示:
type accountNotFoundErr struct {
id uuid.UUID
}
func (err accountNotFoundErr) Error() string {
return fmt.Sprintf("account not found for user: %v", err.id)
}
func IsAccountNotFoundErr(err error) bool {
_, ok := err.(accountNotFoundErr)
return ok
}
func GetAccount(ctx context.Context, id uuid.UUID) (*Account, error) {
// if the account is not found
return nil, accountNotFoundErr{id}
}
我喜欢第一个,因为它很简单,但我不经常看到 Go 代码在错误为非 nil 时返回 nil 结果。我认为期望是,如果错误为零,则结果是有效的。第二种方法解决了这个问题,但对调用者来说也有点复杂。
在 Go 中处理此类案例的惯用方法是什么?
【问题讨论】:
-
您应该确定找不到帐户是否是错误。这可能因功能/用例而异。例如。如果在登录期间用户指定了用户名,则查找该帐户可能很容易不存在(用户可能输入错误的用户名)。但是如果你想查找一个已登录的账号,如果他/她已经登录,则该账号必须存在,这种情况下找不到账号就意味着错误。不管是什么情况,记录你的函数的行为总是好的。
标签: go