一、map
1、map是key-value数据结构,又称为字段或者关联数组。
二、基本语法
1、var map变量名map[keytype]valuetype
2、key的类型
golang中的map,的key可以是很多种类型,比如bool,数字,string, 指针,channel , 还可以是只包含前面几个类型的接口,结构体,数组,通常为int、string
slice,map还有function 不可以,因为这几个没法用==来判断
3、value的类型
valuetype的类型和key基本一样,通常为:数字(整数,浮点数),string,map ,struct
三、map声明
1、声明是不会分配内存的,初始化需要make,分配内存后才能赋值和使用
2、map的key是不能重复,如果重复了,则以最后这个key-value为准
3、map的value是可以相同的.
4、map的key-value 是无序
使用方式一
package main
import "fmt"
func main() {
//声明一个map
var testMap map[string]string
//给map分配空间,10表示给map分配的大小
testMap = make(map[string]string,10)
testMap["1"] = "老王"
testMap["2"] = testMap["1"]
fmt.Println(testMap)
}
使用方式二
package main
import "fmt"
func main() {
stringMap := make(map[string]string)
stringMap["1"] = "小王"
stringMap["2"] = stringMap["1"]
fmt.Println(stringMap)
}
使用方式三
package main
import "fmt"
func main() {
stringMap := map[string]string{"1": "张三", "2": "李四",}
fmt.Println(stringMap)
}
练习一
我们要存放3个学生信息,每个学生有name和sex信息
package main
import "fmt"
func main() {
//声明一个map
stuMap := make(map[string]map[string]string)
//第二个map也需要make
stringMap1 := make(map[string]string)
stringMap2 := make(map[string]string)
stringMap3 := make(map[string]string)
stuMap["1"] = stringMap1
stuMap["1"]["姓名"] = "小红"
stuMap["1"]["性别"] = "男"
stuMap["2"] = stringMap2
stuMap["2"]["姓名"] = "小王"
stuMap["2"]["性别"] = "女"
stuMap["3"] = stringMap3
stuMap["3"]["姓名"] = "小章"
stuMap["3"]["性别"] = "女"
fmt.Println(stuMap)
}
四、map的增删改查
1、增加
参考使用方式二
2、删除
package main
import "fmt"
func main() {
stringMap := make(map[string]string)
stringMap["1"] = "小王"
stringMap["2"] = stringMap["1"]
stringMap["3"] = "张三"
//删除map的内容
delete(stringMap,"1")
//当删除的key不存在也不报错
delete(stringMap,"4")
fmt.Println(stringMap)
}
package main
import "fmt"
func main() {
stringMap := make(map[string]string)
stringMap["1"] = "小王"
stringMap["2"] = stringMap["1"]
stringMap["3"] = "张三"
//删除map的内容
delete(stringMap,"1")
//当删除的key不存在也不报错
delete(stringMap,"4")
//删除所有map
//1、遍历删除
//for key, _ := range stringMap {
// delete(stringMap,key)
//}
//2、make一下
stringMap = make(map[string]string)
fmt.Println(stringMap)
}
3、查找
package main
import "fmt"
func main() {
stringMap := make(map[string]string)
stringMap["1"] = "小王"
stringMap["2"] = stringMap["1"]
stringMap["3"] = "张三"
key,val := stringMap["3"]
if val {
fmt.Println(key)
}else {
fmt.Println("没有这个key")
}
}
五、map的遍历
package main
import "fmt"
func main() {
stringMap := make(map[string]string)
stringMap["1"] = "小王"
stringMap["2"] = stringMap["1"]
stringMap["3"] = "张三"
for _, value := range stringMap {
fmt.Println(value)
}
fmt.Println("==========================")
//声明一个map
stuMap := make(map[string]map[string]string)
//第二个map也需要make
stringMap1 := make(map[string]string)
stringMap2 := make(map[string]string)
stringMap3 := make(map[string]string)
stuMap["1"] = stringMap1
stuMap["1"]["姓名"] = "小红"
stuMap["1"]["性别"] = "男"
stuMap["2"] = stringMap2
stuMap["2"]["姓名"] = "小王"
stuMap["2"]["性别"] = "女"
stuMap["3"] = stringMap3
stuMap["3"]["姓名"] = "小章"
stuMap["3"]["性别"] = "女"
for _, value1 := range stuMap {
for _, value2 := range value1 {
fmt.Println(value2)
}
}
}
六、map切片
import "fmt"
func main() {
maps := make([]map[string]string,2)
strings1 := make(map[string]string)
strings2 := make(map[string]string)
if maps[0] == nil {
maps[0] = strings1
maps[0]["姓名"] = "张三"
maps[0]["性别"] = "男"
}
if maps[1] == nil {
maps[1] = strings2
strings2["姓名"] = "李四"
strings2["性别"] = "女"
}
strings3 := make(map[string]string)
strings3["姓名"] = "王五"
strings3["性别"] = "未知"
//使用append改变切片
strings := append(maps, strings3)
fmt.Println(strings)
}
七、map排序
package main
import (
"fmt"
"sort"
)
func main() {
strings := make(map[int]string)
strings[3] = "小王"
strings[2] = "小李"
//定义一个切片
var slice []int
//遍历map拿到key
for key, _ := range strings {
slice = append(slice,key)
}
sort.Ints(slice)
for _, val := range slice {
fmt.Println(strings[val])
}
}
八、map的注意事项
1、map是引用类型
import "fmt"
func updateMap(intMap map[int]int) {
intMap[1] = 4
}
func main() {
intMap := make(map[int]int)
intMap[1] = 1
intMap[2] = 2
intMap[3] = 3
updateMap(intMap)
fmt.Println(intMap)
}
2、map容量会自动扩容
3、map的value也经常使用struct类型,更适合管理复杂的数据
package main
import "fmt"
//定义一个结构体
type student struct {
Name string
Age int
Achievement float32
}
func main() {
students := make(map[string]student)
s1 := student{
Name:"小红",
Age:12,
Achievement:88.5,
}
students["01"] = s1
for _, value := range students {
fmt.Println(value)
}
}
九、练习
package main
import "fmt"
//定义一个函数
func modifyUser(strings map[string]map[string]string,name string ) {
if strings[name] != nil {
strings[name]["passWord"] = "888888"
}else {
userMap3 := make(map[string]string)
strings[name] = userMap3
userMap3["nickName"] = "蜡笔小新"
userMap3["passWord"] = "123456"
}
}
func main() {
var name = "张三"
strings := make(map[string]map[string]string)
userMap1 := make(map[string]string)
userMap2 := make(map[string]string)
strings["张三"] = userMap1
userMap1["nickName"] = "蒙面人"
userMap1["passWord"] = "123456"
strings["李四"] = userMap2
userMap2["nickName"] = "超人"
userMap2["passWord"] = "123456"
//fmt.Println(strings)
modifyUser(strings,name)
fmt.Println(strings)
}