• 从零开始学Go之容器(三):映射


    map 是一种特殊的数据结构:一种元素对(pair)的无序集合,pair 的一个元素是 key,对应的另一个元素是 value,所以这个结构也称为关联数组或字典。

    声明:

    var 映射名称 map[键类型]值类型

    var map1 map[string]int

    key 可以是任意可以用 == 或者 != 操作符比较的类型,比如 string、int、float

    value 可以是任意类型的;通过使用空接口类型,我们可以存储任意值,但是使用这种类型作为值时需要先做一次类型断言

    在map中key值是唯一的

    映射使用:

    初始化:

    跟数组和切片一样,仅声明是无法使用的。需要初始化后才能使用

    var a map[int]int
    a = make(map[int]int)
    b := make(map[string]int)//是上面两行的组合形式
    c := make(map[string]int, 100)//第二个参数是容量即map长度,这个参数是可选的
    d := map[int]int{1:1,2:2}//声明的同时初始化
     
    赋值:

    映射名称[键] = 值

    a := make(map[int]int)
    a[1] = 2

    由于在map中键是唯一的,所以重复赋值会改变键对应的值

    func main() {
     var a map[int]int
     a =make(map[int]int)
     a[1]=2
     a[1]=3
     fmt.Println(a)
    }

    运行结果

    map[1:3]

     
    取值:

    变量 := 映射名称[键]

    a := make(map[int]int)
    a[1] = 2
    b := a[1]//b=2
    int c
    c = a[2]//c=0

    取值的方式是通过map的键值来查询,如果没有对应的键值,则会赋map值的空值

     

    多key单value:

    如果需要多key对单value的时候可以用结构体作为key

    type Vertex struct {
     X, Y int
    }
    var a map[Vertex]int

    只有当实例化的结构体的X,Y都相等时,才能找到对应的值

     

    单key多value:

    如果需要单key对多value的时候可以用切片作为value

    mp1 := make(map[int][]int)
    mp2 := make(map[int]*[]int)

     

    映射遍历:

    map的遍历跟数组和切片相似,一样有下标和range的方式,但是由于map的查找是hash查找,range出的索引是无序的

    func main() {
     a := make(map[int]int)
     for i := 0; i < 5; i++ {
      a[i] = i
     }
     //仿C的写法
     for i := 0; i < len(a); i++ {
      fmt.Println(a[i])
     }
    ​
     //go中的range方法
     for k, v := range a {
      fmt.Println(k, v)
     }
    }

    运行结果:

    0

    1

    2

    3

    4

    3 3

    4 4

    0 0

    1 1

    2 2

     

    映射元素的删除:

    func delete(m map[Type]Type1, key Type)

    第一个参数时map名称,第二是对应键值

    func main() {
     a := make(map[int]int)
     for i := 0; i < 5; i++ {
      a[i] = i
     }
     delete(a,2)//删除map中的键值2以及对应值
     fmt.Println(a)
    }

    运行结果

    map[4:4 0:0 1:1 3:3]

  • 相关阅读:
    在HTML中使用JavaScript
    小强的HTML5移动开发之路(49)——HTML5开发神器HBuilder
    小强的HTML5移动开发之路(48)——(小练习)新闻订阅系统【1】
    QT学习记录之控件布局
    QT学习记录之理解信号槽机制
    小强的HTML5移动开发之路(47)——jquery mobile基本的页面框架
    Linux下MySQL备份以及crontab定时备份
    Linux管理日记(三)
    小强的HTML5移动开发之路(46)——汇率计算器【2】
    kindeditor实现ctrl+v粘贴word图片并上传
  • 原文地址:https://www.cnblogs.com/VingB2by/p/11087322.html
Copyright © 2020-2023  润新知