我在Go语言中有一个带有以下签名的函数:
func GetAccount(ctx context.Context, id uuid.UUID) (*Account, error)
如果出现内部错误(例如数据库查询失败),它将返回错误,但是如果找不到该帐户,我不确定应该返回什么。我可以想到两种不同的方法:
- 如果未找到帐户,则只返回空帐户和空错误
- 返回自定义错误类型,如下所示:
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结果。我认为期望是,如果错误为零,则结果有效。第二种方法解决了这个问题,但对调用者来说也更加复杂。
在Go中处理这种情况的惯用方法是什么?