gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:22:21 25 4
gpt4 key购买 nike

我有一个在 Go 中返回 (*sql.Rows, error) 的函数。在某些情况下,没有任何返回值,但也没有错误。选择似乎是:

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
}

但这看起来很愚蠢。有什么建议吗?

最佳答案

我会稍微不同地处理这个问题,只是将处理程序传递给您的函数。因此,如果您的函数当前是:

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() {
// ...
}
})

这将使您传递的函数只有在有行时才会被调用,如果它是您关心的,您会得到错误,并且调用者的语法非常干净。

关于go - 如何创建一个空的 sql.Rows 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51620432/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com