从零开始学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]

posted @ 2019-06-25 23:18  VingB2by  阅读(132)  评论(0编辑  收藏  举报