诡异的开局
map作为开发最重要的数据结构,被大量的使用,今天和大家说说我遇到的坑。
废话不多少,先上代码:
func main() {
assetAllocation := map[string]float32{
"bank_product": 0.14,
"deposit": 0.86
}
mapTest(assetAllocation)
fmt.Println(assetAllocation)
mapTest2(assetAllocation)
fmt.Println(assetAllocation)
}
func mapTest(data map[string]float32){
data =nil
}
func mapTest2(data map[string]float32){
data["bank_product"] =0
}
传值还是传引用
大家可以猜猜看结果是什么,第一个打印的结果是assetAllocation的值并没有改变。第二个打印的结果是assetAllocation中的bank_product被修改为0.
-如果是传值,那么第二种情况解释不通
-如果是传引用,那么第一中情况是什么情况呢
原来是这样
golang中所有的函数传递的确是传值。那么为什么传到函数中map的值被改变了呢, 这个是和map的实现息息相关的。因为map本身并没有直接实现hashmap的功能,而是包含了一个对hashmap的指针,导致虽然是传值,但是底层数据的的确是相同的。这样函数内部对数据的更改也会操作到原来的map
如果不想要这个天然效果怎么办呢
遇到问题的时候,其实需要就是一个纯粹的传值的情况,所以需要自己copy一个新的map。
func copyMap(original map[string]float32, dest map[string]float32) {
for k, v := range original {
dest[k] = v
}
}