我有一个(*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 回答
![?](http://img1.sycdn.imooc.com/533e4d660001312002000200-100-100.jpg)
白衣染霜花
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() {
// ...
}
})
这将具有传递给您的函数,仅当存在行时才调用该函数,如果您关心的是行,则您将得到错误,并且调用方的语法很干净。
- 1 回答
- 0 关注
- 254 浏览
添加回答
举报
0/150
提交
取消