简体   繁体   English

将行扫描成切片

[英]Scan row into slice

I want to Scan a sql.Row into a slice like so:我想将 sql.Row 扫描成一个切片,如下所示:

func printRows(rows *sql.Rows){
    defer rows.Close()

    for rows.Next() {
        var row = []interface{}{}
        err := rows.Scan(row...)
        if err != nil {
            log.Fatal(err)
        }
        r, err := json.Marshal(row)
        if err != nil {
            log.Fatal(err)
        }
        log.Println("row:", r);
    }
}

but I am getting this error:但我收到此错误:

2020/02/23 20:05:14 raw query: SELECT * FROM user_table LIMIT 500 2020/02/23 20:05:14 sql: expected 6 destination arguments in Scan, not 0 2020/02/23 20:05:14 原始查询:SELECT * FROM user_table LIMIT 500 2020/02/23 20:05:14 sql:扫描中预期有 6 个目的地 arguments,而不是 0

anyone know how to make this generic without using a slice?任何人都知道如何在不使用切片的情况下制作这个通用的?

You can do it this way:你可以这样做:

cols, err := rows.Columns() // Remember to check err afterwards
vals := make([]interface{}, len(cols))
for i, _ := range cols {
    vals[i] = new(string)
}

for rows.Next() {
    err = rows.Scan(vals...)
}

on the inte.net they say you can use:在 inte.net 上,他们说您可以使用:

    vals[i] = new(sql.RawBytes)

instead of代替

    vals[i] = new(string)

but I think (string) is fine, idk但我认为 (string) 很好,idk

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM