为了账号安全,请及时绑定邮箱和手机立即绑定

如何创建一个空的sql.Rows实例?

如何创建一个空的sql.Rows实例?

Go
MMMHUHU 2021-04-02 14:11:40
我有一个(*sql.Rows, error)在Go中返回的函数。在某些情况下,没有任何返回值,但是也没有错误。选择似乎是:if (...) {    return nil, nil}然后,在调用方中:rows, err := fn()if err != nil {    return nil, err}if rows == nil {   ...} else {    for rows.Next() {    ...    }}否则返回一个特殊的错误,然后我检查。我认为如果可以返回一个有效的Rows实例,将会更加优雅,但是除了Next()调用它的方法时返回false之外,它什么也没有做,就像这样:if (...) {    return EmptyRows(), nil}并且,在呼叫者中:rows, err := fn()if err != nil {    return nil, err}for rows.Next() {    ...}我可以做类似的事情:if (...) {    return db.QueryRows("select * from something where true=false"), nil}但这似乎很愚蠢。有什么建议吗?
查看完整描述

1 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

我将对此进行一些不同的处理,然后将处理程序传递给您的函数。因此,如果您的函数当前为:


func YourFunc() (*sql.Rows, error) {

    // ...

    if (...) {

        return nil, nil

    }

    return rows, nil

}

它将是:


func yourFunc() (*sql.Rows, error) {

    // ...

    if (...) {

        return nil, sql.ErrNoRows

    }

    return rows, nil

}


func YourFunc(cb func(*sql.Rows)) error {

    rows, err := yourFunc()

    if err == sql.ErrNoRows {

        return nil

    }

    if err != nil {

        return err

    }

    cb(rows)

    return nil

}

然后在您的呼叫者中:


err := YourFunc(func(row *sql.Rows) {

    for rows.Next() {

        // ...

    }

})

这将具有传递给您的函数,仅当存在行时才调用该函数,如果您关心的是行,则您将得到错误,并且调用方的语法很干净。


查看完整回答
反对 回复 2021-04-19
  • 1 回答
  • 0 关注
  • 254 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信