Go 在具有rows.NextResultSet()的多结果集查询中调用rows.Err()

Go 在具有rows.NextResultSet()的多结果集查询中调用rows.Err(),go,Go,我正在使用多个结果集构建一个查询,如下所示。为方便起见,请将重要信息复制到下面 我的问题是,是否应该在rows.Next(){…}循环的每个之后调用rows.Err(),而不是像示例中所示在最后调用一次?为什么?我的理解是rows.Err()将捕获错误,而rows.NextResultSet()将捕获。似乎我想在每次迭代中捕捉错误,不是吗?谢谢 rows, err := db.Query(q, age) if err != nil { log.Fatal(err) } defer row

我正在使用多个结果集构建一个查询,如下所示。为方便起见,请将重要信息复制到下面

我的问题是,是否应该在rows.Next(){…}循环的每个
之后调用
rows.Err()
,而不是像示例中所示在最后调用一次?为什么?我的理解是
rows.Err()
将捕获错误,而
rows.NextResultSet()
将捕获。似乎我想在每次迭代中捕捉错误,不是吗?谢谢

rows, err := db.Query(q, age)
if err != nil {
    log.Fatal(err)
}
defer rows.Close()

for rows.Next() {
    var (
        id   int64
        name string
    )
    if err := rows.Scan(&id, &name); err != nil {
        log.Fatal(err)
    }
    fmt.Printf("id %d name is %s\n", id, name)
}
if !rows.NextResultSet() {
    log.Fatal("expected more result sets", rows.Err())
}
var roleMap = map[int64]string{
    1: "user",
    2: "admin",
    3: "gopher",
}
for rows.Next() {
    var (
        id   int64
        role int64
    )
    if err := rows.Scan(&id, &role); err != nil {
        log.Fatal(err)
    }
    fmt.Printf("id %d has role %s\n", id, roleMap[role])
}
if err := rows.Err(); err != nil {
    log.Fatal(err)
}

您可以从
Next
Err
NextResultSet
函数的源代码中发现,
lasterr
Rows
结构的成员,可以通过多种方式进行设置,
Err
如果不是
EOF
,则始终返回它

这些方法是:

  • Next
    获取一些错误,设置
    lasterr
    并始终返回
    false
    (因此
    对于行。Next(){…
    不会重复更多,仅在循环后检查
    行。Err()
  • NextResultSet
    在出现错误时也设置
    lasterr
    ,并返回
    false
  • 所以答案应该是肯定的。因为如果
    NextResultSet
    after
    Next
    返回
    false
    它的错误将替换
    Next
    中的错误