Golang的map

诡异的开局

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

effective-go.png

如果不想要这个天然效果怎么办呢

遇到问题的时候,其实需要就是一个纯粹的传值的情况,所以需要自己copy一个新的map。

func copyMap(original map[string]float32, dest map[string]float32) {
    for k, v := range original {
        dest[k] = v
    }
}

你可能感兴趣的:(Golang的map)