文章目录
- 一、Go语言的 字典
- 1.1、格式
- 1.2、map的三种定义方式
- 1.2.1、方式一: 通过Go提供的语法糖快速创建(常用)
- 1.2.2、方式二:通过make函数创建 make(类型, 容量)
- 1.2.3、方式三:通过make函数创建 make(类型)
- 1.2.4、方式四: 通过map直接创建
- 二、字典map的增删改查
- 2.1 、增
- 2.2、修改
- 2.3、删除
- 2.4 、查询: 通过ok-idiom模式判断指定键值对是否存储
- 2.5、字典遍历
一、Go语言的 字典
- map在创建的时候会指定类型,所以只能存放相同的数据类型
go中的 字段称为map和python的dict不一样
- map翻译过来就是字典或者映射, 可以把map看做是切片的升级版
- 切片是用来存储一组相同类型的数据的, map也是用来存储一组相同类型的数据的
- 在切片中我们可以通过索引获取对应的元素, 在map中我们可以通过key获取对应的元素
- 切片的索引是系统自动生成的,从0开始递增. map中的key需要我们自己指定
- 只要是可以做==、!=判断的数据类型都可以作为key(数值类型、字符串、数组、指针、
结构体、接口) - map的key的数据类型不能是:slice、map、function
- map和切片一样容量都不是固定的, 当容量不足时底层会自动扩容
- map格式: var dic map[key数据类型]value数据类型
1.1、格式
var 字典名称 map[key数据类型]value数据类型
1.2、map的三种定义方式
1.2.1、方式一: 通过Go提供的语法糖快速创建(常用)
var dic map[string]string = map[string]string{"name": "隔壁老王", "habby": "喜欢隔壁少妇"}
fmt.Println(dic) // map[habby:喜欢隔壁少妇 name:隔壁老王]
1.2.2、方式二:通过make函数创建 make(类型, 容量)
var dict = make(map[string]string, 3)
dict["name"] = "隔壁老张"
dict["hobby"] = "喜欢隔壁小姐姐"
fmt.Println(dict) // map[hobby:喜欢隔壁小姐姐 name:隔壁老张]
1.2.3、方式三:通过make函数创建 make(类型)
var dict = make(map[string]string)
dict["name"] = "隔壁小刘"
dict["hobby"] = "被隔壁王姐喜欢"
fmt.Println(dict) // map[hobby:被隔壁王姐喜欢 name:隔壁小刘]
1.2.4、方式四: 通过map直接创建
var mapTwo = map[string]string{}
mapTwo["name"] = "俺是老王"
fmt.Println(mapTwo) // map[name:俺是老王]
mapFour := map[string]string{
"name": "老王",
"age": "20", // 需要已逗号结束
}
fmt.Println(mapFour) // map[age:20 name:老王]
和切片一样,没有被创建的map是不能使用的
// map声明后没有定义的话不能直接使用,只有通过make或语法糖创建之后才会开辟空间,才能使用
var dict map[string]string
dict["name"] = "张姐" // 报错因为没
fmt.Println(dict)
二、字典map的增删改查
2.1 、增
- 和python的操作一样: ‘字典名[元素] = 值’
func MapSaturday() {
var dict map[string]string = map[string]string{"name": "老王", "age": "16"}
// map字典添加数据 直接 '字典名[元素] = 值' 来添加
dict["nameone"] = "老张"
dict["ageone"] = "28"
fmt.Println(dict) // map[age:16 ageone:28 name:老王 nameone:老张]
}
---------
func MapSunday() {
var dict = map[string]string{"name": "隔壁老王", "age": "18"}
fmt.Println(dict)
var dictOne = make(map[string]string, 3)
dictOne["name"] = "隔壁老张"
dictOne["age"] = "19"
fmt.Println(dictOne)
}
2.2、修改
- 修改: 当map中有指定的key时就会自动修改
func MapSunday() {
var dict = map[string]string{"name": "隔壁老王", "age": "18"}
fmt.Println(dict)
var dictOne = make(map[string]string, 3)
dictOne["name"] = "隔壁老张"
dictOne["age"] = "19"
fmt.Println(dictOne) // map[age:19 name:隔壁老张]
// 修改
dictOne["name"] = "我是修改后的name值"
dictOne["age"] = "我是修改后的age值"
dictOne["sex"] = "因为我没有我就是新增"
fmt.Println(dictOne) // map[age:我是修改后的age值 name:我是修改后的name值 sex:因为我没有我就是新增]
}
2.3、删除
- 删除: 可以通过Go语言内置delete函数删除指定元素
- delete(字典名, “要删除的key”) 第一个参数: 被操作的字典 , 第二个参数: 需要删除元素对应的key
func MapOne() {
var dict = make(map[string]string, 3)
dict["name"] = "老王"
dict["age"] = "19"
dict["sex"] = "男"
dict["hobby"] = "喜欢女"
dict["sss"] = "xxx"
fmt.Println(dict) // map[age:19 hobby:喜欢女 name:老王 sex:男 sss:xxx]
// 删除元素
delete(dict, "sss")
delete(dict, "aaaa") // 没有这个元素则不操作,也不报错
fmt.Println(dict) // map[age:19 hobby:喜欢女 name:老王 sex:男]
}
2.4 、查询: 通过ok-idiom模式判断指定键值对是否存储
func MapFindOne() {
var dict map[string]string = map[string]string{"name": "laowang", "age": "18", "sex": "男"}
value, ok := dict["age1"]
if ok {
fmt.Println("字典有这个key,对应的值为", value)
} else {
fmt.Println("字典没有这个key,对应的值为", nil)
}
if value, ok := dict["age"]; ok {
fmt.Println("字典有这个key,对应的值为", value)
}
}
2.5、字典遍历
- 注意: map和数组以及切片不同,map中存储的数据是无序的,所以多次打印的 顺序可能不同
var dict map[string]string = map[string]string{"name": "laowang", "age": "18", "sex": "男"}
for key, value := range dict {
fmt.Println(key, value)
}