在Go语言中,db.QueryRow.Scan 函数不能直接将数据库查询结果扫描到 map 中。Scan 函数要求你将查询结果的每一列分别扫描到对应的变量中,这些变量通常是基本类型(如 int, string, time.Time 等)或指针类型。
如果你希望将查询结果存储到 map 中,你需要手动处理这个过程。以下是一个示例代码,展示了如何将查询结果存储到 map[string]interface{} 中:
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
func main() {
db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/dbname")
if err != nil {
panic(err)
}
defer db.Close()
row := db.QueryRow("SELECT id, name, age FROM users WHERE id = ?", 1)
columns, err := row.Columns()
if err != nil {
panic(err)
}
values := make([]interface{}, len(columns))
for i := range values {
values[i] = new(sql.RawBytes)
}
err = row.Scan(values...)
if err != nil {
panic(err)
}
result := make(map[string]interface{})
for i, col := range columns {
result[col] = string(*values[i].(*sql.RawBytes))
}
fmt.Println(result)
}
row.Columns(): 获取查询结果的列名。values := make([]interface{}, len(columns)): 创建一个 []interface{} 切片,用于存储每一列的值。values[i] = new(sql.RawBytes): 为每一列分配一个 sql.RawBytes 类型的指针,用于存储原始字节数据。row.Scan(values...): 将查询结果扫描到 values 切片中。result := make(map[string]interface{}): 创建一个 map 用于存储最终的查询结果。result[col] = string(*values[i].(*sql.RawBytes)): 将每一列的值转换为字符串并存储到 map 中。int, time.Time 等),你需要根据实际情况进行类型转换。db.Query 和 rows.Scan,并在循环中处理每一行。虽然 db.QueryRow.Scan 不能直接将结果扫描到 map 中,但你可以通过手动处理列和值来实现这一功能。