map数据结构

  • map简介
    • map的声明
    • map相关操作
    • map嵌套
    • map是一个引用类型
    • slice of map
    • map排序(无序)
    • map反转

map简介

  • map是引用类型,必须初始化才能使用

map的声明

声明是不会分配内存的,初始化需要make

var map1 map[keytype]valuetype
var a map[string]string
var a map[string]int
var a map[int]string
var a map[string]map[string]string

// map实例-1 声明一个map并初始化-1
func testMap1() {
	var a map[string]string         //声明一个map
	a = make(map[string]string, 10) //初始化,申请内存空间
	a["abc"] = "efg"
	a["abc2"] = "efg44"
	fmt.Println(a)
}

// map实例-2 声明一个map并初始化-2
func testMap2() {
	var a map[string]string = map[string]string{
		"key": "value",
	} //声明一个map,并且初始化
	a["abc"] = "efg"
	a["abc2"] = "efg44"
	fmt.Println(a)
}

map相关操作

  //声明一个map
	var m1 map[string]int
	fmt.Println(m1 == nil) //还没有初始化,就没有内存空间的开辟

	//初始化map
	m1 = make(map[string]int, 10) //申请map的大小

	//map增加和更新值
	m1["lqx"] = 20
	m1[""] = 21
	m1["lqx"] = 18
	fmt.Println(m1) //map[lqx:18 刘:21]

	//判断是否存在一个值
	fmt.Println(m1["lll"]) //如果没有值,会返回一个默认值
	v, ok := m1["lll"]     //如果不存在,ok会返回false
	fmt.Println(v, ok)

	//长度
	fmt.Println(len(m1))

	//遍历map
	for i, v := range m1 {
		fmt.Println(i, v)
	}

	// delete()函数删除键值对
	delete(m1, "lqc") //如果没有,就忽略
	delete(m1, "lqx")
	fmt.Println(m1)

map嵌套

// map实例-3 map嵌套
func testMap3() {
	a := make(map[string]map[string]string, 100) //声明一个map,并初始化,指定大小为100
	a["key1"] = make(map[string]string)          //初始化map里面的map
  
	a["key1"]["key2"] = "abc"
	a["key1"]["key3"] = "abc"
	fmt.Println(a)
}

// map实例-4 判断map值,查找,添加,修改
func modify(a map[string]map[string]string) {
	_, ok := a["zhangsan"]
	if !ok {
		a["zhangsan"] = make(map[string]string)
	}
	a["zhangsan"]["password"] = "123456"
	a["zhangsan"]["nickname"] = "pangpang"
	return
}
func testmap4() {
	a := make(map[string]map[string]string, 100)
	modify(a)
	fmt.Println(a)
}

// map实例-5 遍历map,删除,计算长度
func testmap5() {
	a := make(map[string]map[string]string, 100) //声明一个map,并初始化,指定大小为100
	a["key1"] = make(map[string]string)          //初始化map里面的map

	a["key1"]["key2"] = "abc"
	a["key1"]["key3"] = "abc"
	a["key1"]["key4"] = "abc"
	a["key1"]["key5"] = "abc"
	a["key2"] = make(map[string]string) //初始化map里面的map
	a["key2"]["key1"] = "abc"
	a["key2"]["key2"] = "abc"
	a["key2"]["key3"] = "abc"
	for k, v := range a {
		fmt.Println(k)
		for k1, v1 := range v {
			fmt.Println("\t", k1, v1)
		}
	}

map是一个引用类型

slice of map

func testmap6() {
	// var a = make([]map[int]int, 5) //等同于下面的写法
	var a []map[int]int
	a = make([]map[int]int, 5)

	for i := 0; i < 5; i++ {
		a[i] = make(map[int]int)
	}
	a[0][10] = 100
	fmt.Println(a) //[map[10:100] map[] map[] map[] map[]]
}

map排序(无序)

  • 先获取所有key,把key进行排序
  • 按照排序好的key,进行遍历
func testmapsort() {
	// var a = make([]map[int]int, 5) //等同于下面的写法
	var a map[int]int
	a = make(map[int]int, 5)

	a[0] = 1003
	a[12] = 1012311
	a[11] = 1012123
	a[10] = 103123
	a[1] = 1012222
	a[3] = 10121
	a[5] = 10123
	fmt.Println(a) //map[0:1003 1:1012222 3:10121 5:10123 10:103123 11:1012123 12:1012311]
}

map反转

  • 初始化另外一个map,把key,value互换即可
func testmapsort1() {
	var a map[string]int
	var b map[int]string

	a = make(map[string]int, 5)
	b = make(map[int]string, 5)
	a["abc"] = 101
	a["ccc"] = 1123123
	for k, v := range a {
		b[v] = k
	}
	fmt.Println(a, "\t", b)
}

你可能感兴趣的