一、什么是map
1.map是key-value数据结构,又称为字段或关联数组。 类似于其他语言的集合,类似集合,所以是无序的。
二、map的声明
1.声明语法: var mapname map[ keytype ] valuetype
var mymap map[string]string
2.map的key可以是很多种类型的, 如:bool、int、string、指针、channel ,接口、结构体、数组。通常为int 和 string。
但是请注意:slice、map、function 绝对不可以作为map的key,因为这几个没法用 ==来判断出key
3.map的value可以是多种类型。 如:bool、int、string、指针、channel ,接口、结构体、数组、slice、map、function
三、map的初始化
1.map声明后,需要make()函数初始化后才能正常使用。
2.map没有make初始化,读取值是空,进行赋值操作会panic
var mymap map[string]string //声明
mymap = make(map[string]string) //make初始化
mymap["a"] = "golang" //赋值
fmt.Println(mymap["a"]) //读取
var test map[string]string //声明
fmt.Println(test["a"]) //未初始化,读取到的值为空
test["a"] = "golang" //未初始化,panic : assignment to entry in nil map
四、map的使用方式:三种
1.先声明、再make初始化
2.直接声明并make初始化
3.直接声明并make初始化+赋值
//1.声明 再初始化
var mymap map[string]string
mymap = make(map[string]string)
mymap["a"] = "golang"
fmt.Println(mymap["a"])
//2.声明并初始化
//var mymap2 map[string]string = make(map[string]string)
//可直接推导类型初始化
mymap2 := make(map[string]string)
mymap2["a"] = "java"
fmt.Println(mymap2["a"])
//3.声明并初始化+赋值
//var mymap3 map[string]string = map[string]string {"a":"php"}
//可直接推导类型初始化
mymap3 := map[string]string {"a":"php"}
fmt.Println(mymap3["a"])
五、map的curd(增删改查)
1.添加和修改:key存在时就修改,不存在时就添加
mymap := make(map[string]string)
mymap["a"] = "java" //添加
mymap["b"] = "golang" //添加
mymap["c"] = "php" //添加
fmt.Println(mymap["a"]) //查看 java
mymap["a"] = "js" //修改
fmt.Println(mymap["a"]) //查看 js
2.删除,内置函数 delecte( mapname , key )
注意:delete函数,删除的key如果存在则删除,不存在则不操作,但是不会报错,没有返回值
mymap := make(map[string]string)
mymap["a"] = "java" //添加
mymap["b"] = "golang" //添加
mymap["c"] = "php" //添加
delete(mymap,"a") //删除 没有返回值
fmt.Println(mymap["a"]) //查看 为空
fmt.Println(mymap) //查看 map[b:golang c:php]
3.查看
3.1注意:查看不存在的值时为 零值,从map中取值如不确定key是否存在时需要先判断 value,ok := mymap["a"],如果存在 ok == true 不存在 ok == false
mymap := make(map[string]int)
mymap["a"] = 1 //添加
fmt.Println(mymap["b"]) //查看 0
fmt.Println(mymap) //查看 map[a:1]
value,ok := mymap["c"] //map中取值
fmt.Println(ok) //false
fmt.Println(value) //零值 0
value2,ok2 := mymap["a"] //map中取值
fmt.Println(ok2) //true
fmt.Println(value2) //1
3.2 遍历: map 的key是无序的,遍历map只能用 for range 不能用for(map的key不是整形数字)。
3.3 map的长度 使用 len() 内置函数计算。如果map没有初始化(分配内存) 长度为0
lang := make(map[string]string)
lang["a"] = "golang"
lang["b"] = "java"
lang["c"] = "php"
lang["d"] = "js"
//第一次遍历
for index,value := range lang {
fmt.Println(index,"----",value)
}
fmt.Println("----------------")
//第二次遍历
for index2,value2 := range lang {
fmt.Println(index2,"----",value2)
}
fmt.Println(len(lang)) //已有键值对数:4
//没有初始化的map
var mymap map[string]string
fmt.Println(len(mymap)) //没有初始化的map长度为0
执行结果为:
六、map是引用类型
函数传参为map 对传入的map进行修改,则外部的map同步修改,所以它是引用类型
package main
import "fmt"
func change(m map[string]string) {
m["b"] = "c++"
}
func main() {
lang := make(map[string]string)
lang["a"] = "golang"
lang["b"] = "java"
lang["c"] = "php"
lang["d"] = "js"
change(lang)
fmt.Println(lang["b"]) // c++
fmt.Println(lang) //map[a:golang b:c++ c:php d:js]
}