我尝试使用errors.is(...)方法比较golang中的一个sql错误,该方法总是返回false。
我声明了一个错误类型变量,如下所示。
var ErrNoRows = errors.New("no rows in result set")
在流程的某个地方,我尝试将错误值与“ErrNoRows”错误进行比较,该错误总是返回false。
但是,如果我在调试模式下打印错误,它将打印为..
(dlv) p err
error(*errors.errorString) *{
s: "no rows in result set",}
并且打印ErrNoRows也返回相同的结果。
(dlv) p ErrNoRows
error(*errors.errorString) *{
s: "no rows in result set",}
但是这两个对象并不相等,当我把它们和Error.is函数比较的时候。
err := tx.QueryRow(ctx, sqlstmt).Scan(&myvar)
if errors.Is(err, ErrNoRows) {
...
}
上面的检查总是失败。我在这里做错了什么?我正在使用https://github.com/jackc/pgx进行sql操作。
编辑我已经看过这个问题(How to compare Go errors)
上面的问题是关于使用错误。是(...),而不是一个幼稚的相等比较。我按照这个问题线程的建议。
我得到错误是因为我不知道我仍然必须处理错误对象的相同示例,正如@mkopriva所澄清的那样。
1条答案
按热度按时间mxg2im7a1#
多亏了mkopriva的建议,我理解了错误对象与原始包提供的相同错误示例的比较。
我的理解是,使用errors.Is()函数可能会进行深度(属性比较),而不必担心相同的对象。但正如评论中所建议的,情况并非如此。
我必须将调用sql函数返回的err与同一包提供的err对象进行比较。