Sql 在go中合并行扫描和行扫描接口?

Sql 在go中合并行扫描和行扫描接口?,sql,go,Sql,Go,我对Go中的特定表有两个查询—一个用于检索单个项,另一个用于返回列表。第一个使用sql.DB.QueryRow,因为它只需要检索一行,第二个使用sql.DB.Query返回一些不同的结果 问题是序列化需要做一些工作,我想用一个方法来扫描数据库行并将其读入Go类型,从而使序列化变得简单。我现在的代码如下所示: // Some type which varies considerably from its DB representation, and takes some effort to ser

我对Go中的特定表有两个查询—一个用于检索单个项,另一个用于返回列表。第一个使用
sql.DB.QueryRow
,因为它只需要检索一行,第二个使用
sql.DB.Query
返回一些不同的结果

问题是序列化需要做一些工作,我想用一个方法来扫描数据库行并将其读入Go类型,从而使序列化变得简单。我现在的代码如下所示:

// Some type which varies considerably from its DB representation, and takes some effort to serialize.
type Foo struct {
    Baz *Baz
    Board [8][8]int
}

// Get one foo by its id
func GetFoo(id int) {
    row := db.QueryRow("select * from foo where id = ?", id)
    // Work that's duplicated from below...
     var foo Foo
    row.Scan(&foo.blah, &foo.etc)
    // Do more work to serialize the type...
}

// Get all of the fooes
func GetFooes() {
    rows, err := db.Query("select * from foo")
    for rows.Next() {
        // Work that's duplicated from above...
        var foo Foo
        rows.Scan(&foo.blah, &foo.etc)
        // Do more work to serialize the type...
    }
}
然而,将row.Scan和rows.Scan结合起来有点棘手。我想我可以用这样的东西:

func serializeFoo(scanner sql.Scanner) (*Foo, error) {

}
尽管sql.Scanner只接受一个
(值接口{})
,而不是
(…值接口{})
的列表


有什么建议吗?另一个解决方案是将单个
QueryRow
调用转换为
db.Query

db.QueryRow是一个方便的函数。没有理由使用它,除非它可以节省键入/代码的复杂性。在本例中,情况并非如此,因此我建议您只使用db.Query

有关更多详细信息,请参阅


正如您所提到的,行和行都没有实现Scanner接口。Scanner用于变量扫描函数的参数

如果希望有一个参数允许行或行,则需要创建自己的接口,例如:

func serializeFoo(scanner interface{Scan(dest ...interface{}) error}) (*Foo, error) {

}