为了账号安全,请及时绑定邮箱和手机立即绑定

将数据库行读入地图并附加到地图切片

将数据库行读入地图并附加到地图切片

Go
UYOU 2021-10-11 10:40:59
我正在尝试使用地图和这些地图的切片来存储从数据库查询返回的行。但是我在 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()循环,以便在每次迭代时创建一个新地图,然后将其附加到切片。


查看完整回答
反对 回复 2021-10-11
  • 1 回答
  • 0 关注
  • 166 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信