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