关于 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` 值不同。

...全文
695 1 打赏 收藏 转发到动态 举报
写回复
用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对象。 实际应用中不应该像那那样写,在循环内部就应当将数据转给别的对象赋值给循环外面的对象,而不是复用循环中的对象。 这一块你可以多多练习一下额。
make是在1977年在贝尔实验室(Bell Labs)研发的 Unix系统中的一款依赖关系检查工具程序(Utility software)。make的应用非常广泛,它被用来构建 C、C++ 、Pascal  Fortran 等项目,自动化构建生成可执行文件或者库文件。make通过读取Makefile文件以自动化建构软件, 它会根据依赖文件的修改时间进行判断。确定一个target的依赖关系,然后把生成这个target的相关命令传给shell去执行。GNU make 和大多数版本的 make 之间最重要的区别是 GNU make 是自由软件,常和GNU编译系统一起被使用,是大多数GNU Linux安装的一部分。GNU makemakefile 中具有许多强大的功能,超出了其他 make 版本的功能,它还可以重新生成、使用、然后删除不需要保存的中间文件。GNU make 还有一些非常方便的简单功能。例如,选项“假装源文件文件没有更改,即使它已更改。当您向头文件添加新宏时,这非常有用。大多数版本的 make 都会假设它们必须重新编译所有使用头文件的源文件,但是如果您知道对头文件的更改不需要重新编译 GNU make 为您提供了一种避免重新编译的方法-o file 。 黄强老师针对零编程基础的同学,精心打磨make核心知识点,帮助你快速掌握Linux编程中的make的构建!适用人群: 零基础、新手、想快速学习Linux下C、C++编程的童鞋!

435

社区成员

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

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