猿问

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

我有一个(*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

}

但这似乎很愚蠢。有什么建议吗?


MMMHUHU
浏览 255回答 1
1回答

白衣染霜花

我将对此进行一些不同的处理,然后将处理程序传递给您的函数。因此,如果您的函数当前为: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() {        // ...    }})这将具有传递给您的函数,仅当存在行时才调用该函数,如果您关心的是行,则您将得到错误,并且调用方的语法很干净。
随时随地看视频慕课网APP

相关分类

Go
我要回答