当前位置: 首页 > 面试题库 >

将数据库行读取到地图中并追加到地图切片中

柳梓
2023-03-14
问题内容

我正在尝试使用地图和这些地图的切片来存储从数据库查询返回的行。但是我在row.Next()以及最终的每次迭代中得到的都是查询中同一行的切片。似乎问题与我存储的存储位置相同有关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)
}

问题答案:

这是因为您存储在切片中的是指向地图的指针,而不是地图的副本。

从实际运行的Go地图中:

地图类型是引用类型,例如指针或切片…

由于您是在更新地图的循环之外创建地图,因此您将不断用新数据覆盖地图中的数据,并且每次都将指向同一地图的指针附加到切片中。因此,您可以在切片中获得同一事物的多个副本(这是从表中读取的最后一条记录)。

要进行处理,请var myMap = make(map[string]interface{})进入for rows.Next()循环,以便在每次迭代时创建一个新映射,然后将其附加到切片。



 类似资料:
  • 问题内容: 我想创建一个切片图,将值附加到相应切片上。但是,当尝试直接附加到通过访问它返回的切片时(请参见下面的注释),它不会被存储,因此我不得不使用长格式访问(注释下方的行)。 为什么会这样呢?我希望访问地图可以返回某种指针,所以在我看来;显然,我错了。 谢谢! 问题答案: 如果基础数组必须增长以适应新元素,则append返回一个新切片。因此,是的,您必须将新的切片放回地图中。例如,这与字符串的

  • 我有一个JSP代码将数据追加到datatables中,从另一个AJAX页面获得响应,当将数据追加到表中时,数据的追加非常奇怪。我将在下面展示它。 正确的数据应该是这样的: 从AJAX页面获取数据的JSP代码 下面是我将Array结果附加到DT中的JAVA代码 在控制台中,它显示正确,但在添加到表中时,它是错误的。

  • 在Go中,有没有更简单/更好的方法从地图中获取一部分密钥? 目前,我正在遍历地图并将关键点复制到一个切片:

  • 我需要从Excel表中读取数据,并需要将数据转换为键值对。 我已经写了下面的代码。 这是我的代码: 我得到的结果如下: 然而,我需要的输出,所有的头列应该来在映射键和相应的数据应该作为值。 我需要将我的数据设置为如下格式,请帮助<代码>地图

  • 本文向大家介绍python抓取网页中图片并保存到本地,包括了python抓取网页中图片并保存到本地的使用技巧和注意事项,需要的朋友参考一下 在上篇文章给大家分享PHP源码批量抓取远程网页图片并保存到本地的实现方法,感兴趣的朋友可以点击了解详情。 通过Python抓取指定Url中的图片保存至本地 以上代码是小编给大家介绍的python抓取网页中图片并保存到本地的全部内容,希望大家喜欢。

  • 问题内容: 我怎么能展平的(同类型)s到一个用Java 8? 问题答案: 我的语法可能有些偏离,但是flatMap应该为您完成大部分工作: