Go 将数据库行读入地图并附加到地图切片
我试图使用映射和这些映射的切片来存储从数据库查询返回的行。但是我在rows.Next()和final的每次迭代中得到的是来自查询的同一行的切片。问题似乎与存储位置相同有关,因为我存储了Go 将数据库行读入地图并附加到地图切片,go,Go,我试图使用映射和这些映射的切片来存储从数据库查询返回的行。但是我在rows.Next()和final的每次迭代中得到的是来自查询的同一行的切片。问题似乎与存储位置相同有关,因为我存储了cols,但直到现在我才解决它 我在这里遗漏了什么: 源代码如下: package main import ( "database/sql" _ "github.com/lib/pq" "fmt" "log" "reflect" ) var myMap = make(m
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)
}
主程序包
进口(
“数据库/sql”
_“github.com/lib/pq”
“fmt”
“日志”
“反映”
)
var myMap=make(映射[字符串]接口{})
var mySlice=make([]映射[字符串]接口{},0)
func main(){
fmt.Println(“这是我的围棋场。”)
//数据库连接-
db,err:=sql.Open(“postgres”,“user=postgres dbname=proj2 dbcruddb dev password=12345 sslmode=disable”)
如果错误!=零{
log.Fatalln(错误)
}
行,err:=db.Query(“从userstable中选择id、用户名、密码”)
延迟行。关闭()
如果错误!=零{
log.Fatal(错误)
}
colNames,err:=行。列()
如果错误!=零{
log.Fatal(错误)
}
cols:=make([]接口{},len(colNames))
colPtrs:=make([]接口{},len(colNames))
对于i:=0;i
这是因为切片中存储的是指向地图的指针,而不是地图的副本
从
映射类型是引用类型,如指针或切片
由于在更新映射的循环之外创建映射,因此会不断使用新数据覆盖映射中的数据,并且每次都会向切片添加指向同一映射的指针。因此,您可以在切片中获得相同内容的多个副本(即从表中读取的最后一条记录)
要进行处理,请将var myMap=make(map[string]interface{})
移动到行的循环中。下一步()
循环,以便在每次迭代中创建一个新映射,然后将其附加到切片中