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

我正在尝试使用地图和这些地图的切片来存储从数据库查询返回的行。但是我在 rows.Next() 和 final 的每次迭代中得到的是查询中同一行的切片。似乎问题与我存储的内存位置相同cols,但直到现在我才能解决它。


我在这里错过了什么:


源代码如下:


package main


import (

    "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)

}


UYOU
浏览 173回答 1
1回答

陪伴而非守候

这是因为您在切片中存储的是指向映射的指针,而不是映射的副本。来自Go 地图的实际应用:映射类型是引用类型,如指针或切片...由于您在更新它的循环之外创建地图,因此您不断用新数据覆盖地图中的数据,并且每次都将指向同一地图的指针附加到切片。因此,您会在切片中获得相同内容的多个副本(作为从表中读取的最后一条记录)。要处理,请var myMap = make(map[string]interface{})进入for rows.Next()循环,以便在每次迭代时创建一个新地图,然后将其附加到切片。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go