我正在尝试使用go sql驱动程序从数据库表中读取数据,并将值转换为[]map[string]interface{}。列名称是映射的键,值是interface{}。我将所有列添加到数组中。我以https://github.com/go- sql-driver/mysql/wiki/Examples上的 “ RawBytes”代码示例作为示例开始。
[]map[string]interface{}
interface{}
但是,在示例中-所有列值都转换string为如下所示,
string
// Fetch rows for rows.Next() { // get RawBytes from data err = rows.Scan(scanArgs...) if err != nil { panic(err.Error()) // proper error handling instead of panic in your app } // Now do something with the data. // Here we just print each column as a string. var value string for i, col := range values { // Here we can check if the value is nil (NULL value) if col == nil { value = "NULL" } else { value = string(col) //ATTN : converted to string here } fmt.Println(columns[i], ": ", value) } fmt.Println("-----------------------------------") }
有没有办法保留它,interface{}这样我就可以在使用[]map[string]interface{}
基于的答案。使用它,您可以执行以下操作:
var myMap = make(map[string]interface{}) rows, err := db.Query("SELECT * FROM myTable") defer rows.Close() if err != nil { log.Fatal(err) } colNames, err := rows.Columns() if err != nil { log.Fatal(err) } cols := make([]interface{}, len(colNames)) colPtrs := make([]interface{}, len(colNames)) for i := 0; i < len(colNames); i++ { colPtrs[i] = &cols[i] } for rows.Next() { err = rows.Scan(colPtrs...) if err != nil { log.Fatal(err) } for i, col := range cols { myMap[colNames[i]] = col } // Do something with the map for key, val := range myMap { fmt.Println("Key:", key, "Value Type:", reflect.TypeOf(val)) } }
然后,使用反射包,您可以根据需要获取每列的类型,如循环末尾所示。
这是通用的,适用于任何表,列数等。