我正在尝试使用地图和这些地图的切片来存储从数据库查询返回的行。但是我在 rows.Next() 和 final 的每次迭代中得到的是查询中同一行的切片。似乎问题与我存储的内存位置相同cols,但直到现在我才能解决它。我在这里错过了什么:源代码如下:package mainimport ( "database/sql" _ "github.com/lib/pq" "fmt" "log" "reflect")var myMap = make(map[string]interface{})var mySlice = make([]map[string]interface{}, 0)func main(){ fmt.Println("this is my go playground.") // DB Connection- db, err := sql.Open("postgres", "user=postgres dbname=proj2-dbcruddb-dev password=12345 sslmode=disable") if err != nil { log.Fatalln(err) } rows, err := db.Query("SELECT id, username, password FROM userstable") 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) } fmt.Println("cols: ", cols) for i, col := range cols { myMap[colNames[i]] = col } mySlice = append(mySlice, myMap) // Do something with the map for key, val := range myMap { fmt.Println("Key:", key, "Value:", val, "Value Type:", reflect.TypeOf(val)) } fmt.Println("myMap: ", myMap) fmt.Println("mySlice: ", mySlice) } fmt.Println(mySlice)}
1 回答
陪伴而非守候
TA贡献1757条经验 获得超8个赞
这是因为您在切片中存储的是指向映射的指针,而不是映射的副本。
来自Go 地图的实际应用:
映射类型是引用类型,如指针或切片...
由于您在更新它的循环之外创建地图,因此您不断用新数据覆盖地图中的数据,并且每次都将指向同一地图的指针附加到切片。因此,您会在切片中获得相同内容的多个副本(作为从表中读取的最后一条记录)。
要处理,请var myMap = make(map[string]interface{})
进入for rows.Next()
循环,以便在每次迭代时创建一个新地图,然后将其附加到切片。
- 1 回答
- 0 关注
- 166 浏览
添加回答
举报
0/150
提交
取消