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

刚学 Golang 不久,勿喷

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

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

共 3 个回复


HobaiRiku

你这里我觉得,是由于doc的内存地址是唯一的(你在外面make的),result这个map在value上都存的是同一个地址,所以第一个183进去了是正确的,然后doc值被修改变为505,但是505对应的value地址和183的是一个,所以之前的会被覆盖。

# 0

colefan

for docs.Next(&doc) {
	
	// 屏幕输出 (1)
	fmt.Println(doc["mobilenumber"], doc)
	
	// 此处为发帖想问的问题
	// 用 手机号前 7 位作为 key,map[string]string 作为 value
	result[doc["mobilenumber"]] = doc
}

在这段代码中,doc内容被重置了
result[doc["mobilenumber"]] = doc 永远指向同一个map

# 1

zhao6810

指针传递与值传递问题。GO有指针。结果1,2 重复问题是引用了相同地址。

# 2