美文网首页
Golang的map

Golang的map

作者: visado | 来源:发表于2017-10-20 13:45 被阅读0次

诡异的开局

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
    }
}

相关文章

  • Go map底层实现

    golang map源码详解Golang map 如何进行删除操作?

  • golang语言map的并发和排序

    golang语言map的并发和排序 map的并发问题 golang缺省的map不是thread safe的,如果存...

  • map golang

    原文链接:map-GOLANG

  • 我设计的golang面试题

    1 golang中的引用类型 ``` slice、map、channel、interface ``` 2、map如...

  • golang声明一个map数组

    golang 声明一个map数组

  • Golang之Map源码

    引用 深入 Go 的 Map 使用和实现原理 哈希表 深度解密Go语言之map Golang map 的底层实现 使用

  • Golang map

    Golang map map用来存储多个键值对,与java中的map功能相似。 直接声明 需要注意: key,va...

  • (九)golang sync map 源码分析

    golang中的map是不支持并发操作的,golang推荐用户直接用读写锁对map进行保护,也有第三方类库使用分段...

  • golang:map

    什么是map? map是一个可以存储key/value对的一种数据结构,map像slice一样是引用类型,map内...

  • Golang:map

    map golang 中提供映射关系容器为map,其内部使用散列表(hash)实现 map 是一种无序的基于key...

网友评论

      本文标题:Golang的map

      本文链接:https://www.haomeiwen.com/subject/iegmuxtx.html