【发布时间】:2015-10-30 12:17:40
【问题描述】:
从数据库查询并尝试插入切片时遇到问题(包含一些地图[字符串]接口{}) 即使我已经使用 make 创建了一个新的内存块,切片似乎总是映射到同一个内存块。
type DBResult []map[string]interface{}
func ResultRows(rows *sql.Rows, limit int) (DBResult, error) {
cols, err := rows.Columns()
if err != nil {
return nil, err
}
vals := make([]sql.RawBytes, len(cols))
scanArgs := make([]interface{}, len(vals))
for i := range vals {
scanArgs[i] = &vals[i]
}
if limit > QUERY_HARD_LIMIT {
limit = QUERY_HARD_LIMIT
}
res := make(DBResult, 0, limit)
for rows.Next() {
err = rows.Scan(scanArgs...)
m := make(map[string]interface{})
for i := range vals {
m[cols[i]] = vals[i]
}
/* Append m to res */
res = append(res, m)
/* The value of m has been changed */
fmt.Printf("lib: m:\n\n%s\n\n", m)
/* When printing res, always mapping to the same memory block */
fmt.Printf("lib: res:\n\n%s\n\n", res)
}
return res, err
}
结果如下,可以发现res的内容是一样的
m = map[comment:first_comment id:0]
res = [map[id:0 comment:first_comment]]
m = map[id:1 comment:first_comment]
res = [map[id:1 comment:first_comment] map[id:1 comment:first_comment]]
m = map[id:2 comment:first_comment]
res = [map[id:2 comment:first_comment] map[id:2 comment:first_comment] map[id:2 comment:first_comment]]
我的期望 res = [map[id:0 comment:first_comment] map[id:1 comment:first_comment] map[id:2 comment:first_comment]]
感谢收看
【问题讨论】:
-
标记使用的 dbms,以获得更好的帮助 - 更快。
-
切片就是这样工作的。也许你可以展示一个更短的独立程序?无论如何:您必须重新设计您的解决方案。
-
在没有 sql 的较短程序中,可以追加切片。
-
先检查Scan的错误。