golang,获取一条记录,数据库找不到记录,是返回特殊的 error 还是返回 nil , error 也返回 nill

2016-07-29 12:56:43 +08:00
 void1900

golang ,获取一条记录,数据库找不到记录,是返回 error 还是 返回对象 nil , error 也返回 nill

比如用用户 ID 获取用户资料

我是返回一个特殊的 error

func (* UserModel) GetUser(uid uint) user User, err error {
   ....
   return user, ErrorNotFound
}

还是返回 nil, nil

func (* UserModel) GetUser(uid uint) user *User, err error {
   ....
   return nil, nil
}
1926 次点击
所在节点    Go 编程语言
26 条回复
ryanking8215
2016-07-29 13:03:19 +08:00
我选 nil, nil
armandinho
2016-07-29 13:11:44 +08:00
通常是这么来的。

func (* UserModel) GetUser(uid uint) user *User, err error {
....
return nil, nil
}

func (* UserModel) MustGetUser(uid uint) user User, err error {
....
return user, ErrorNotFound
}
void1900
2016-07-29 13:23:22 +08:00
@ryanking8215 我也喜欢 nil,nil 这种 不过我刚开始用 golang ,所以比较不确定。。
void1900
2016-07-29 13:23:53 +08:00
@armandinho 好像也可以,不过一般不会定义两个功能几乎一样的方法吧。。
leitwolf
2016-07-29 13:26:23 +08:00
user=nil,err=errors.New("user not found")
return;
windy0925
2016-07-29 13:31:26 +08:00
error 应该返回 nil
cloudzhou
2016-07-29 13:32:44 +08:00
这个问题在于 GetUser 没有找到用户,到底算不算一种 error ,就看你的定义了
如果算 error ,一个比较麻烦的地方是,按照 go 的哲学,所有 error 都要明显的 check
在检测错误的时候,你还需要排除 ErrorNotFound 这种情况,就比较繁琐
zhujinliang
2016-07-29 13:39:39 +08:00
@armandinho
Must 开头的函数应该不返回错误,有错误就 panic
yanyuan2046
2016-07-29 13:39:45 +08:00
我使用第二种,在实际项目中每个错误码都是特定的,查询错误是 ErrGetData ,数据不存在是 ErrDataNotExist ,以此类推。这个错误码不是字符串,而是一个对象
type errorCode {
ID string
Namespace string
Code int32
Message string
}
huijiewei
2016-07-29 13:41:13 +08:00
返回 nil ,不管啥语言,不要在内部乱抛出异常
qwepoidjdj
2016-07-29 15:18:44 +08:00
这里看你对错误的定位
我是这样想的(做的) 看这个方法具体面对的层级
如果只是在数据库访问层级 返回 nil 肯定是比 err 合理 因为对于数据库本身来说 就是没有查到数据而不是产生了错误
但是对于业务处理层来说 可能拿到了 nil 以后需要返回一个 err 来通告操作的人
gamexg
2016-07-29 15:22:45 +08:00
nil,nil

实现简单,不用费事的区分开数据库错误还是不存在。
否则还需要定义不同的 error 来区分是数据库错误还是不存在。
evilgod528
2016-07-29 18:45:05 +08:00
mgo 是返回 ErrNotFound
evilgod528
2016-07-29 18:47:47 +08:00
如果返回 nil,nil 那么,每次得到的 user 还得检查是否 nil ,而如果你查到到的 error 为 nil 的话,那么 user 可能有值
evilgod528
2016-07-29 18:48:33 +08:00
@evilgod528 user 肯定有值,打快了,敲错字了
magicdawn
2016-07-29 19:14:53 +08:00
@armandinho

Must 一般是 panic 吧
janxin
2016-07-29 19:30:42 +08:00
return user, ErrorNotFound
janxin
2016-07-29 19:34:53 +08:00
另外其实 golang 中的 error 是个 interface ,所以利用 @yanyuan2046 提到的错误扩展方式其实非常方便
orvice
2016-07-29 20:28:34 +08:00
nil nil
zhx1991
2016-07-29 20:50:08 +08:00
看业务.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/295751

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX