美文网首页
Go语言复合数据类型之map

Go语言复合数据类型之map

作者: WongBynn | 来源:发表于2021-11-16 14:16 被阅读0次

    map概念

    map是使用非常广泛且设计精妙的数据结构之一,在Java里面,我们使用最多的数据结构之一就是map。map是一个拥有键值对元素的无序集合,在这个集合中,键的值是唯一的,可以通过键来获取、更新、删除对应的值。无论散列表多大,这些操作都可以在常量的时间内完成。

    map细节

    • 声明一个map:
    var ages map[string]int
    或者下面这样
    ages := make(map[string]int) //创建一个从string到int的map
    

    我们也可以使用map的字面量来声明并初始化一个map:

    ages := map[string]int{
        "alice":31,
        "charlie":23,
        "tom":15
    }
    

    上面的代码等价于:

    ages := make(map[string]int)
    ages["alice"] = 31
    agres["tom"] = 15
    

    因此新建一个空map的表达式,如下:

    map[string]int{}
    
    • 通过键来获取map中对应的值:
    fmt.Println(ages["alice"]) // "32"
    
    • 通过内置函数delete()来删除一个元素:
    delete(ages,"tom")
    

    如果我们删除了一个不存在于ages中的键值对,那么程序也不会报错。这是因为Go语言对于零值的巧妙使用无处不在。

    i++i += 1的快捷赋值方式也同样适用于map,如:

    ages["bob"] += 1

    ages["bob"]++

    • map的元素的地址无法被获取到,这是因为map的增长会导致已有元素的地址会被更新,使得原有的地址变得无效。

    _ = &ages["alice"]

    • 遍历map:
    for k,v := range ages{
        fmt.Printf("%s\t%d\n",name,age)
    }
    

    map的迭代顺序是随机的,这是因为不同的实现方法会采用不同的散列算法,得到不同的元素顺序。如果我们必须要按照某种顺序来迭代map,我们该怎么做呢?在Java中我们可以实现compare接口,在Go语言中,我们可以这样做,先给键排序,如果键是其他类型,也可以使用该思想去实现:

    import "sort"
    var names []string
    for name := range ages{
        names = append(names,name) 
    }
    sort.Strings(names)
    for _,name := range names{
        fmt.Printf("%s\t%d",name,ages[name])
    }
    

    当map的键值有序的话,那么值也就有序了。

    • map的比较

    map和slice一样,不能够直接进行比较,唯一合法的比较就是和nil进行比较,为了判断两个map是否相等,必须写一个循环。

    func equal(x,y map[string]int) bool{
        if len(x) != len(y){
            return false
        }
        for k,xv := range x{
            if yv,ok := y[k]; !ok || yv != xv{
                return false
            }
        }
        return true
    }
    

    相关文章

      网友评论

          本文标题:Go语言复合数据类型之map

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