Golang学习之路—map

map的基本介绍

map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。

map的声明

1、基本语法

var 变量名 map[keytype]valuetype

说明:

  • golang中的map的key可以是很多种类型,比如bool,string,指针,channel,整数,浮点数,还可以是包含前面几个类型的接口,结构体,数组。通常key为int,string。注意:slice,map还有function不可以,因为这几个没办法用==判断。
  • valuetype的类型和key基本一样。通常为整数、浮点数,string,map,struct。

2、map声明举例

var a map[string]string
var a map[int]string
var a map[string]int
var a map[string]map[string]string
...

注意:声明是不会分配内存的,初始化需要make,分配内存后才能赋值和使用。

3、案例演示

package main

import(
	"fmt"
)

func main(){
    
    
	//map的声明和注意事项
	var a map[string]string
	//在使用map前,需要先make,make的作用就是给map分配数据空间
	a = make(map[string]string,10)
	a["no1"] = "Casey"
	a["no2"] = "Jerry"
	a["no3"] = "Jessical"
	a["no1"] = "Huhuhu"
	fmt.Println(a)
}

运行结果:
在这里插入图片描述

说明:

  • map在使用前一定要make
  • map的key是不能重复的,如果重复了,则以最后这个key-value为准。
  • map的value可以相同的
  • map的key-value是无序的
  • make内置函数
    在这里插入图片描述

map的使用

package main

import(
	"fmt"
)

func main(){
    
    
	//第一种使用方式
	var a map[string]string
	//在使用map前,需要先make,make的作用就是给map分配数据空间
	a = make(map[string]string,10)
	a["no1"] = "Casey"
	a["no2"] = "Jerry"
	a["no3"] = "Jessical"
	a["no1"] = "Huhuhu"
	fmt.Println(a)
	//第二种使用方式
	cities := make(map[string]string)
	cities["c1"] = "北京"
	cities["c2"] = "深圳"
	cities["c3"] = "广州"
	fmt.Println(cities)

	//第三种使用方式
	heroes := map[string]string{
    
    
		"hero1" : "宋江",
		"hero2" : "卢俊义",
		"hero3" : "武松",
	}
	heroes["hero4"] = "林冲"
	fmt.Println(heroes)
}

运行结果:
在这里插入图片描述
练习案例:

package main

import(
	"fmt"
)

//案例
/* 
  演示一个key-value的value是map的案例
  比如:我们要存放学生的信息,每个学生有name,sex信息

*/
func main(){
    
    
	stuMap := make(map[string]map[string]string)
   
	stuMap["stu1"] = make(map[string]string)
	stuMap["stu1"]["name"] = "Casey"
	stuMap["stu1"]["sex"] = "女"

	stuMap["stu2"] = make(map[string]string)
	stuMap["stu2"]["name"] = "Jerry"
	stuMap["stu2"]["sex"] = "男"

	fmt.Println(stuMap)
	fmt.Println(stuMap["stu1"])
	fmt.Println(stuMap["stu2"]["name"])


}

运行结果:
在这里插入图片描述

map的增删改查操作

1、map增加和更新

map[key] = value
如果key还没有,就是增加,如果key存在就是修改。

func main(){
    
    
	
	var a map[string]string
	
	a = make(map[string]string,10)
	a["no1"] = "Casey"
	a["no2"] = "Jerry"
	a["no3"] = "Jessical"
	a["no1"] = "Huhuhu"
	fmt.Println(a)
}

2、map删除

delete(map,key),delete是一个内置函数,如果key存在,就删除该key-value,如果key不存在,不操作,但是也不会报错。
在这里插入图片描述
案例演示

package main

import(
	"fmt"
)

//案例
/* 
  演示一个key-value的value是map的案例
  比如:我们要存放学生的信息,每个学生有name,sex信息

*/
func main(){
    
    
	
	var a map[string]string
	
	a = make(map[string]string,10)
	a["no1"] = "Casey"
	a["no2"] = "Jerry"
	a["no3"] = "Jessical"
	a["no1"] = "Huhuhu"
	fmt.Println(a)
	delete(a,"no1")
	fmt.Println(a)
}

运行结果:
在这里插入图片描述
说明:
如果我们要删除map中的所有key,没有一个专门的方法一次删除,可以遍历一下key,逐个删除,或者map = make(…),make一个新的,让原来的成为垃圾,被gc回收。

3、map查找

val, key := a["no2"]
	if key {
    
    
		fmt.Printf("查找成功,值为%v\n",val)
	}else{
    
    
		fmt.Printf("没有找到...\n")
	}

运行结果:
在这里插入图片描述
**说明:**如果a这个map中存在“no2”,那么就会返回true,否则返回false。

map遍历

map的遍历使用for-range的结构遍历。

package main

import(
	"fmt"
)

func main(){
    
    
	
	var a map[string]string
	
	a = make(map[string]string,10)
	a["no1"] = "Casey"
	a["no2"] = "Jerry"
	a["no3"] = "Jessical"
	a["no1"] = "Huhuhu"
	for key, value := range a{
    
    
		fmt.Printf("k = %v,v = %v\n",key,value)
	}
}

运行结果:
在这里插入图片描述

map使用细节

  1. map是引用类型,遵守应用类型传递的机制,在一个函数接收map,修改后,会直接修改原来的map
  2. map的容量达到后,再想增加元素,会自动扩容,并不会发生panic,也就是说map能动态的增长键值对(key-value)
    将容量改为1后,程序仍可正常运行。
func main(){
    
    
	
	var a map[string]string
	//j将容量改为1
	a = make(map[string]string,1)
	a["no1"] = "Casey"
	a["no2"] = "Jerry"
	a["no3"] = "Jessical"
	a["no1"] = "Huhuhu"
	for key, value := range a{
    
    
		fmt.Printf("k = %v,v = %v\n",key,value)
	}
}

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44736475/article/details/114150263