golang比较错误返回false,即使在使用errors.is()比较之后也是如此

carvr3hs  于 2022-12-07  发布在  Go
关注(0)|答案(1)|浏览(180)

我尝试使用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所澄清的那样。

mxg2im7a

mxg2im7a1#

多亏了mkopriva的建议,我理解了错误对象与原始包提供的相同错误示例的比较。
我的理解是,使用errors.Is()函数可能会进行深度(属性比较),而不必担心相同的对象。但正如评论中所建议的,情况并非如此。
我必须将调用sql函数返回的err与同一包提供的err对象进行比较。

err := tx.QueryRow(ctx, sqlstmt).Scan(&myvar)
if errors.Is(err, pgx.ErrNoRows) {
...
}

相关问题