刚学 `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` 值不同。
更多评论
```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对象。
实际应用中不应该像那那样写,在循环内部就应当将数据转给别的对象赋值给循环外面的对象,而不是复用循环中的对象。
这一块你可以多多练习一下额。
#1