golang学习笔记010--map

1.基本介绍

map是key-value 数据结构,类似其它编程语言的集合
● 基本语法: var map 变量名 map[keytype]valuetype
  ○ key可以是很多种类型
    ■ 比如bool,数字,string,指针,channel,还可以是接口,结构体,数组.通常为int,string
    ■ 注意:slice,map还有function不可以,因为这几个没法用==来判断
  ○ valuetype的类型和key基本一样,通常为数字,string,map,structmap声明举例:var a map[string]stringvar a map[string]intvar a map[int]map[string]string
  ○ 注意:声明是不会分配内存的,初始化需要make,分配内存后才能赋值和使用
package main
import "fmt"

func main(){
	var a map[string]string
	a = make(map[string]string,10)
	a["n1"]="张三"
	a["n2"]="李四"
	a["n3"]="王五"
	a["n1"]="赵六"
	fmt.Println(a)//map[n1:赵六 n2:李四 n3:王五]
}

● 对上述代码说明
○ map在使用前一定要make
○ map的key是不能重复的,如果重复了以最后这个kay-value为准
○ map的value是可以相同的
○ map的key-value是无序的
○ make内置函数

2.map的使用

方式一:先定义,再make,再赋值

	var a map[string]string
	a = make(map[string]string,10)
	a["n1"]="张三"
	a["n2"]="李四"
	a["n3"]="王五"
	a["n1"]="赵六"
	fmt.Println(a)//map[n1:赵六 n2:李四 n3:王五]

方式二:定义直接make,再赋值

	b := make(map[string]string)
	b["n1"]="aaa"
	b["n2"]="bbb"
	fmt.Println(b)//map[n1:aaa n2:bbb]

方式三:直接赋值

	c := map[string]string{
		"n1" : "abc",
		"n2" : "cba",
	}
	c["n3"]="qwe"
	fmt.Println(c)//map[n1:abc n2:cba n3:qwe]

举例:

存放3个学生信息,每个学生有name和sex信息
思路:map[string]map[string]string

	studentMap := make(map[string]map[string]string)

	studentMap["stu01"] = make(map[string]string)
	studentMap["stu01"]["name"] = "tom"
	studentMap["stu01"]["sex"] = "男"

	studentMap["stu02"] = make(map[string]string)
	studentMap["stu02"]["name"] = "mary"
	studentMap["stu02"]["sex"] = "女"

	fmt.Println(studentMap)//map[stu01:map[name:tom sex:男] stu02:map[name:mary sex:女]]
	fmt.Println(studentMap["stu01"])//map[name:tom sex:男]
	fmt.Println(studentMap["stu01"]["name"])//	tom

3.map的增删改查

  1. map的增加和更新
    ○ map[“key”]=value
    ○ 如果key没有,就是增加,如果key存在就是修改

  2. map删除
    ○ delete(map,“key”)
    ○ delete是一个内置函数,如果key存在就删除key-value,如果不存在不操作,也不会报错
    ○ 如果想要删除所有key,没有专门的方法一次清空,可以遍历删除key逐个删除或map=make(…),make一个新的,让原来的成为垃圾,被gc回收

  3. map查找

	b := make(map[string]string)
	b["n1"]="aaa"
	b["n2"]="bbb"
	fmt.Println(b)//map[n1:aaa n2:bbb]
	val,ok :=b["n2"]
	if ok{
		fmt.Println("有n2,值为:",val)//有n2,值为: bbb
	}else{
		fmt.Println("没有")
	}
  1. map遍历
    map遍历使用for-range
	b := make(map[string]string)
	b["n1"]="aaa"
	b["n2"]="bbb"

	for k,v:=range b{
		fmt.Printf("k=%v v=%v",k,v)//k=n1 v=aaak=n2 v=bbb
	}
	studentMap := make(map[string]map[string]string)
	studentMap["stu01"] = make(map[string]string)
	studentMap["stu01"]["name"] = "tom"
	studentMap["stu01"]["sex"] = "男"
	
	studentMap["stu02"] = make(map[string]string)
	studentMap["stu02"]["name"] = "mary"
	studentMap["stu02"]["sex"] = "女"
	
	for k1,v1 :=range studentMap{
		fmt.Println("k1=",k1)
		for k2,v2 :=range v1{
			fmt.Printf("\t k2=%v v2=%v\n",k2,v2)
		}
	}
	// k1= stu01
	//      k2=name v2=tom
	//      k2=sex v2=男
	// k1= stu02
	//      k2=name v2=mary
	//      k2=sex v2=女

4.map的长度len

	b := make(map[string]string)
	b["n1"]="aaa"
	b["n2"]="bbb"
	fmt.Println(len(b))//2

5.map切片

切片的数据类型为map,成为map切片,这样map个数就可以动态变化了

	package main
	import(
		"fmt"
	)
	
	func main(){
		//声明一个切片
		var stu []map[string]string
		stu = make([]map[string]string,2)//准备存两个
		//增加学生信息
		if stu[0] == nil {
			stu[0]=make(map[string]string,2)
			stu[0]["name"] = "张三"
			stu[0]["age"]="20"
		}
	
		if stu[1] == nil {
			stu[1]=make(map[string]string,2)
			stu[1]["name"] = "李四"
			stu[1]["age"]="22"
		}
		//下面写法错误,报越界错误
		// if stu[2] == nil {
		// 	stu[2]=make(map[string]string,2)
		// 	stu[2]["name"] = "王五"
		// 	stu[2]["age"]="22"
		// }
	
		//需要使用切片的append函数,可以动态增加stu
		newStu := map[string]string{
			"name":"赵六",
			"age" :"30",
		}
		stu =append(stu,newStu)
		fmt.Println(stu)//[map[age:20 name:张三] map[age:22 name:李四] map[age:30 name:赵六]]
	}

6.map排序

● golang中没有一个专门针对map的key进行排序
● golang中的map默认是无序的,每次遍历,得到的结果都不一样
● 方法:要排序,可以先将key排序,然后根据key遍历输出即可

	package main
	
	import (
		"fmt"
		"sort"
	)
	
	func main(){
		map1 := make(map[int]int,10)
		map1[10]=20
		map1[1]=12
		map1[2]=23
		map1[3]=43
		map1[4]=21
		map1[5]=54
	
		var keys []int
		for k, _ :=range map1{
			keys=append(keys,k)
		}
		sort.Ints(keys)
	
		for _,k :=range keys{
			fmt.Printf("map1[%v]=%v \n",k,map1[k])
		}
		// map1[1]=12
		// map1[2]=23
		// map1[3]=43
		// map1[4]=21
		// map1[5]=54
		// map1[10]=20
	
	}

7.map使用细节

● map是引用类型,遵守引用类型传值机制,在一个函数修改map后,会直接修改原来的map
● map的容量达到后,再想增加map元素,会自动扩容,并不会发生panic,也就是说map能动态的增长键值对
● map的value也经常使用struct类型

	package main
	
	import (
		"fmt"
	)
	
	type Stu struct{
		name string
		age int
		address string
	}
	
	func main(){
		students := make(map[string]Stu,10)
		stu1 := Stu{"tom",18,"北京"}
		stu2 := Stu{"mary",20,"上海"}
		
		students["no1"] = stu1
		students["no2"] = stu2
		fmt.Println(students)//map[no1:{tom 18 北京} no2:{mary 20 上海}]
	
	}

版权声明:本文为qq_45145809原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。