map是key-value数据结构,是一种无序的键值对的集合
1、基本语法
var 变量名 map[keytype]valuetype
注意:slice,map还有function不可以作为key,因为这几个没法用==来判断
var a map[string]string var b map[int]string var c map[int]int var d map[string]int var e map[string]map[string]string
2、使用方式
2.1 先声明后赋值
func main() { var myMap map[string]string myMap = make(map[string]string, 2) myMap["name"] = "小明" myMap["age"] = "18" fmt.Printf("myMap=%v\n", myMap) }
2.2 声明时直接make
func main() { myMap := make(map[string]string, 2) myMap["name"] = "小明" myMap["age"] = "18" fmt.Printf("myMap=%v\n", myMap) }
2.3 声明时直接赋值
func main() { myMap := map[string]string{ "name": "小明", "age": "18", } fmt.Printf("myMap=%v\n", myMap) }
3、map的增删改查
3.1 map[key] = value //如果key还没有就是增加,如果key存在就是修改。
3.2 删除,使用内置函数delete()
func delete(m map[Type]Type1, key Type)
如果key存在,就会删除该key-value,如果key不存在,不操作,但是也不会增加
func main() { myMap := map[string]string{ "name": "小明", "age": "18", } delete(myMap, "name") fmt.Printf("myMap=%v\n", myMap) }
如果要删除map的所有key,没有一个专门的方法一次删除,可以遍历一下key,逐个删除
或者map = make(...),make一个新的map,让原来的称为垃圾,被gc回收
3.3 map查找
func main() { myMap := map[string]string{ "name": "小明", "age": "18", } value, ok := myMap["name"] if ok { fmt.Printf("myMap=%v\n", value) } else { fmt.Println("没找到") } }
如果myMap这个map中存在"name",那么ok就会为true,否则为false
4、map的遍历
使用for-range来遍历
func main() { myMap := map[string]string{ "name": "小明", "age": "18", } for key, value := range myMap { fmt.Printf("key=%v,value=%v\n", key, value) } }
5、map切片
切片的类型如果是map,则我们称为slice of map,map切片,这样使用则map个数就可以动态变化了
func main() { mapSlice := make([]map[string]string, 2) mapSlice[0] = map[string]string{ "name": "小明", "age": "18", } mapSlice[1] = map[string]string{ "name": "小红", "age": "19", } newMap := map[string]string{ "name": "小王", "age": "20", } // 动态添加map mapSlice = append(mapSlice, newMap) fmt.Printf("mapSlice=%v\n", mapSlice) }
6、map排序
golang中没有专门的方法针对map的key进行排序
golang中的map默认是无需的,也不是按照添加的顺序存放的,每次遍历,得到的输出可能不一样。
golang中的排序,是先对key进行排序,然后根据key遍历输出即可
func main() { var intMap map[int]int = make(map[int]int, 10) intMap[0] = 12 intMap[8] = 15 intMap[9] = 10 intMap[7] = 23 intMap[5] = 12 intMap[6] = 50 intMap[3] = 78 intMap[1] = 10 intMap[2] = 82 intMap[4] = 30 // 无序的 fmt.Println("排序前················") for key, value := range intMap { fmt.Printf("key=%v,value=%v\n", key, value) } fmt.Println("排序前················") // 1.先将map的key放到切片中 // 2.对切片进行排序 // 3.遍历切片,然后按照key来输出map的值 keySlice := make([]int, 10) for key, _ := range intMap { keySlice = append(keySlice, key) } sort.Ints(keySlice) fmt.Println("排序后················") for _, key := range keySlice { fmt.Printf("key=%v,value=%v\n", key, intMap[key]) } fmt.Println("排序后················") }