字典类型(map)

概要

在学习任何的编程语言,一般都会一种数据类型称为:字典(map)或映射(map),以键值对为元素的数据集合,例如:

{
	"age":"18",
	"name":"mashiro"
	"e-mail":"mashiro@outlook.com"
}

这种类型最大的特点就是查找速度非常快,因为他的底层存储就是基于哈希表存储的(不同语言还会有一些差异)。
以 取模+拉链法来快速了解下哈希表存储原理,如下图请添加图片描述
这种结果之所以块,是因为根据key可以直接找到数据存放的位置;而其他的数据类型是需要从前到后去逐一比对,相对来说比较耗时
以上只是基本的存储类型,而各个编程语言中的字典都会在此基础上进行相应的修改和优化(想了解更多的可以看一下GO中map底层实现机制)
Map的特点:

  • 键不能重复
  • 键必须可以哈希(目前我们已学的数据类型中,可哈希的有 :int/bool/float/string/array)
  • 无序
    接下来 关于map,可以从两个维度来进行讲解:
  • 常见使用
  • 底层原理剖析

声明&初始化

// userinfo := map[string]string{}
userInfo := map[string]string{"name":"mashiro","age":"18"}
1
userInfo["name"] //mashiro
userInfo["age"] = "20"
userInfo["email"] = "mashiro@outlook.com"
// data := make(map[int]int , 10)
data := make(map[int]int)
data["100"] = 998
data["200"] = 999

//声明,nil
var row map[string]int
row = data
data := make(map[string]int)
data["100"] := 998
data["200"] := 999

//声明,nil
value := new(map[string]int)
//value["k1"] = 123 #报错
value = &data

注意:键不重复&键必须可哈希(int/bool/float/string/array)

v1 := make(map[[2]int]float32)
v1[[2]int{1,1}] = 1.5
v1[[2]int{1,2}] = 3.4

v2 := make(map[[2]int][3]string )
v2[[2]int{1,1}] = [3]string{"mashiro","shina","0w0"}

常用操作

长度和容量

data := map[string]string{"n1":"mashiro","n2":"shina"}
value := len(data) //2
//根据参数值(10),计算出合适的容量
//一个map中会包含很多桶,每个桶可以存放8个键值对。
info := make(map[string]string,10)

info["n1"] = "mashiro"
info["n2"] = "shina"

v1 := len(info) //2
//v2 := cap(info) //报错

添加

data :=map[string]string{"n1":"mashiro","n2":"shina"}
data["n3"] = "0w0"

修改

data := map[string]string{"n1":"mashiro","n2":"shina"}
data["n1"] = "0w0"

删除

data := map[string]string{"n1":"mashiro","n2":"shina"}
delete(data,"n2")

查看

data := map[string]string{"n1":"mashiro","n2":"shina"}
data["n1"]
data := map[string]string{"n1":"mashiro","n2":"shina"}
for key,value := range data{
    fmt.Println(key,value)
}
data := map[string]string{"n1":"mashiro","n2":"shina"}
for key := range data{
	fmt.Println(key)
}
data := map[string]string{"n1":"mashiro","n2":"shina"}
for _, value := range data {
	fmt.Println(value)
}

嵌套

v1 := make(map[string]int)
v2 := make(map[string]string)
v3 := make(map[string...])
v4 := make(map[string][2]int)
v5 := make(map[string][]int)
v6 := make(map[string]map[int]int)
v7 := make(map[string][2]map[string]string)
v7["n1"] = [2]map[string]string{ map[string]string{"name":"mashiro","age":"18"},map[string]string{"name":"shina","age":"19"}}
v7["n2"] = [2]map[string]string{
map[string]string{"name":"0w0","age":"20"},map[string]string{"name":"0o0","age":"21"}}

//伪代码
v7 = {
	n1:[
		{"name":"mashiro","age":"18"}
		{"name":"shina","age","19"}
	],
	n2:[
		{"name":"0w0","age":"20"}
		{"name":"0o0","age":"21"}
	]
}

前提:键不重复 &键必须可哈希

v8 := make(map[int]int)
v8 := make(map[string]int)
v10 := make(map[float32]int)
v11 := make(map[bool]int)
v12 := make(map[ [2]int ]int)
v13 := make(map[ []int ]int)//错误,不可哈希
v14 := make(map[ map[int]int ]int)//错误,不可哈希
v15 := make(map[ [2][]int ]int)//报错
v16 := make(map[ [2]map[string]string ]int)//报错

变量赋值

v1 := map[string]string{"n1":"mashiro","n2":"shina"}
v2 := v1

v1["n1"] = "MASHIRO"

ftm.Println(v1) // {"n1":"MAHSIRO","n2":"shina"}
ftm.Println(v2) // {"n1":"MASHIRO","n2":"shina"}```



  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值