golang sql.RawBytes要怎么样转换成实际类型的变量?

cols, err := rows.Columns() // Remember to check err afterwards
vals := make([]interface{}, len(cols))
for i, _ := range cols {
    vals[i] = new(sql.RawBytes)
}
for rows.Next() {
    err = rows.Scan(vals...)
    // Now you can check each element of vals for nil-ness,
    // and you can use type introspection and type assertions
    // to fetch the column into a typed variable.
}

官方原文链接
官方的Demo是这样写的,最下面留了3行注释:
Now you can check each element of vals for nil-ness, and you can use type introspection and type assertions to fetch the column into a typed variable.
请问这个use type introspection and type assertions to fetch the column into a typed variable到底要怎么实现?
查了诸多资料都没有找到答案。
网上大部分说的都是(string)value强转,可能这些说法都有些年代了,我现在这样写是不行的,会报错。

阅读 9.7k
4 个回答

自答一下
接官方Demo,我是折腾了好久,这样绕了一圈才取到了能转string的值

for key, value := range vals {
    content := reflect.ValueOf(value).Interface().(*sql.RawBytes)
    row[cols[key]] = string(*content)
}

也不知道有没有必要一定这样,是不是有简单点的方法,reflect和指针真是把我绕晕了

预知 SQL 返回值类型时, 可直接传入相应的数据指针. 如

    rows, err := db.Query("select id, name from foo")
    for rows.Next() {
        var id int
        var name string
        err = rows.Scan(&id, &name)
        fmt.Println(id, name)
    }

否则可以通过查询列类型, 结合反射(reflection)模块操作

func (rs *Rows) ColumnTypes() ([]*ColumnType, error)

个人理解:

  • 文档说转换前先需要检查是否为 nil
  • sql.RawBytes 定义是 []byte,正常情况下转 string 没有问题
新手上路,请多包涵

直接默认 *sql.RawBytes 类型,就是比较粗暴。

for _, col := range vals {
    switch col.(type) {
    case *sql.RawBytes:
        rowString += string(*col.(*sql.RawBytes))
        break
推荐问题
宣传栏