关于 make(map[string]interface{}) 的一点疑问

weixin_38064374 2019-09-20 10:56:35
刚学 `Golang` 不久,勿喷

对于使用 `make(map[string]interface{})` 获取值的问题:

```golang
func GetCellBatchLoc(phone []string) map[string]interface{} {

// 获取每个手机号的前 7 位,用以数据库数据查询
var phonesStd []string
for _, ph := range phone {
phonesStd = append(phonesStd, ph[:7])
}

result := make(map[string]interface{})
doc := make(map[string]string)

// 初始化 phone service 的 MGO IP 地址
mgo_utils.Init(config.MGO_IP_SUVDATA)
query := bson.M{"mobilenumber": bson.M{"$in": phonesStd}}
filter := bson.M{"_id": 0, "mobilearea": 1, "areacode": 1, "mobilenumber": 1}

docs := mgo_utils.FindAll(config.MGO_DB_SUVDATA, config.MGO_TABLE_DM_MOBILE, query, filter)

// 迭代获取每一条 MongoDB 数据
for docs.Next(&doc) {

// 屏幕输出 (1)
fmt.Println(doc["mobilenumber"], doc)

// 此处为发帖想问的问题
// 用 手机号前 7 位作为 key,map[string]string 作为 value
result[doc["mobilenumber"]] = doc
}

// 屏幕输出 (2)
for k, v := range result {
fmt.Println(k, " ", v)
}

return result
}
```

用两个手机号 `15901832427, 18875056308` 进行测试,注释里对应屏幕输出(1) (2),结果如下:

```
// 屏幕输出 (1) 结果
1590183 map[areacode:021 mobilearea:上海 上海 mobilenumber:1590183]
1887505 map[areacode:023 mobilearea:重庆 重庆 mobilenumber:1887505]


// 屏幕输出 (2) 结果
// 疑问在这里,value 值为什么相同

1590183 map[areacode:023 mobilearea:重庆 重庆 mobilenumber:1887505]
1887505 map[areacode:023 mobilearea:重庆 重庆 mobilenumber:1887505
```

新人,尝试用 `Go` 改写 `Python` 项目练手,发现了上面这个疑问。

自己初步猜测,应该是指针指向的原因,该怎么写可以保证返回结果 `value` 值不同。

...全文
729 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38070905 2019-09-20
  • 打赏
  • 举报
回复
```go package main import "fmt" func main() { phone := []string{"1590183", "1887505"} result := make(map[string]interface{}) doc := make(map[string]string) for _, v := range phone { doc["mobilenumber"] = v result[doc["mobilenumber"]] = doc doc = make(map[string]string) // 重新产生doc对象 } fmt.Println(result) } ``` 我上面这个测试例子多了一个重新产生doc的步骤。 你的问题就是doc是一个对象,虽然循环内的时候doc是没有问题的,但是赋值给result的永远都是最后一次的对象数据 我上面的写法是在用完doc之后重新产生一个新的doc对象。 实际应用中不应该像那那样写,在循环内部就应当将数据转给别的对象赋值给循环外面的对象,而不是复用循环中的对象。 这一块你可以多多练习一下额。

473

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧