文章目录

  • 一、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)
	}