map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。
1、map定义
语法:
map[KeyType]ValueType
KeyType:表示键的类型。
ValueType:表示键对应的值的类型。
map类型的变量默认初始值为nil,需要使用make()函数来分配内存。语法为:
make(map[KeyType]ValueType, [cap])
注意
:获取
map
的容量不能使用
cap, cap
返回的是数组切片分配的空间大小
,
根本不能用于
map
。要获取
map
的容量,可以用
len
函数。
infoma := make(map[string]string)
infoma["saber"] = "卫宫士郎"
infoma["rider"] = "远坂应"
fmt.Println(infoma)
fmt.Println(infoma["saber"])
package main
import "fmt"
func main() {
/*
值类型 :改变变量副本值的时候,不会改变变量本身的值 (基本数据类型、数组)
引用类型:改变变量副本值的时候,会改变变量本身的值 (切片、map)
*/
//map类型也是引用数据类型
var userinfo1 = make(map[string]string)
userinfo1["username"] = "张三"
userinfo1["age"] = "20"
userinfo2 := userinfo1
userinfo2["username"] = "李四"
fmt.Println(userinfo1)
fmt.Println(userinfo2)
}
2、map 基本使用
map
中的数据都是成对出现的,kv键值对的格式。
map
也支持在声明的时候填充元素,例如:
var infomas = map[string]string{
"sabar" : "卫宫士郎",
"archer" : "远坂樱",
}
fmt.Println(infomas)
3、判断某个键是否存在
var infomas = map[string]string{
"sabar" : "卫宫士郎",
"archer" : "远坂樱",
}
k,check := infomas["sabar"]
fmt.Println(k,check)
// 如果 key 存在 check为 true,v 为对应的值;//不存在 ok 为 false,v 为值类型的零值
4、map 的遍历
infoma := make(map[string]string)
infoma["saber"] = "卫宫士郎"
infoma["rider"] = "远坂应"
for k,v := range infoma{
fmt.Printf("key:%v value:%v\n", k, v)
}
们只想遍历 key 的时候,可以按下面的写法
infoma := make(map[string]string)
infoma["saber"] = "卫宫士郎"
infoma["rider"] = "远坂应"
for k := range infoma{
fmt.Printf("key:%v\n", k)
}
注意: 遍历 map 时的元素顺序与添加键值对的顺序无关。
5、map的相关操作
1、创建 修改map类型的数据
var infomas = map[string]string{
"sabar" : "卫宫士郎",
"archer" : "远坂樱",
}
infomas["sabar"] = "卫宫巨侠"
fmt.Println(infomas)
2、获取 查找map类型的数据
var infomas = map[string]string{
"sabar" : "卫宫士郎",
"archer" : "远坂樱",
}
infomas["sabar"] = "卫宫巨侠"
fmt.Println(infomas["sabar"])
v,check := infomas["archer"]
fmt.Println(v,check)
3、删除map数据里面的key以及对于的值
delete(map, key)
map:表示要删除键值对的map
key:表示要删除的键值对的键
var infomas = map[string]string{
"sabar" : "卫宫士郎",
"archer" : "远坂樱",
}
infomas["sabar"] = "卫宫巨侠"
// fmt.Println(infomas["sabar"])
// v,check := infomas["archer"]
// fmt.Println(v,check)
delete(infomas,"sabar")
fmt.Println(infomas)
4、创建元素为 map 类型的切片
var mapSlice = make([]map[string]string, 2) //这里先定义的是切片的长度以及容量
//初始化map
if mapSlice[0] == nil {
mapSlice[0] = make(map[string]string) //map不初始化的默认值nil,插不进数据
mapSlice[0]["name"] = "卫宫士郎"
mapSlice[0]["servant"] = "sabar"
mapSlice[0]["age"] = "20"
}
//定义的map切片的下标1的kv数据\
if mapSlice[1] == nil {
mapSlice[1] = make(map[string]string) //map不初始化的默认值nil,插不进数据
mapSlice[1]["name"] = "远坂樱"
mapSlice[1]["servant"] = "archer"
mapSlice[1]["age"] = "19"
}
fmt.Println(mapSlice)
这个几点注意避雷:
第一步这里先定义的是切片的长度以及容量
map不初始化的默认值nil,是正常使用不了的,会报错,在判断为nil之后,去初始化,才能往map的kv键值对赋值;
顺便做个for的遍历
var mapSlice = make([]map[string]string, 2) //这里先定义的是切片的长度以及容量
//初始化map
if mapSlice[0] == nil {
mapSlice[0] = make(map[string]string) //map不初始化的默认值nil,插不进数据
mapSlice[0]["name"] = "卫宫士郎"
mapSlice[0]["servant"] = "sabar"
mapSlice[0]["age"] = "20"
}
//定义的map切片的下标1的kv数据\
if mapSlice[1] == nil {
mapSlice[1] = make(map[string]string) //map不初始化的默认值nil,插不进数据
mapSlice[1]["name"] = "远坂樱"
mapSlice[1]["servant"] = "archer"
mapSlice[1]["age"] = "19"
}
for _, v := range mapSlice {
for key,val := range v {
fmt.Printf("%v--%v\n", key, val)
}
}
5、值为切片类型的 map(和map 类型的切片做区分)
var sliceMap = make(map[string][]string)
sliceMap["servant"] =[]string{ //相当于map的kv里面的v做了切片类型,k还是字符串类型
"sabar",
"rider",
"archer",
}
sliceMap["master"] =[]string{
"卫宫士郎",
"远坂应",
"山天众人",
}
for _, v := range sliceMap {
// fmt.Println(k, v)
for _, value := range v {
fmt.Println(value)
}
}
6、基于map中k的排序
思路:将map中的key,通过append写入一个切片,然后调用sort对切片进行排序,然后再利用排序好的切片中的key去依次取map中的value。
package main
import (
"fmt"
"sort"
)
func main() {
//map的排序
sortMap := make(map[int]int, 10)
sortMap[9] = 19
sortMap[2] = 32
sortMap[1] = 17
sortMap[3] = 18
sortMap[4] = 10
sortMap[6] = 11
//1、把map的key放在切片里面
var keySlice []int
for key, _ := range sortMap {
keySlice = append(keySlice, key)
}
fmt.Println(keySlice)
//2、让key进行升序排序
sort.Ints(keySlice)
fmt.Println(keySlice)
//3、循环遍历key输出map的值
for _, v := range keySlice {
fmt.Printf("key=%v value=%v\n", v, sortMap[v])
}
}
统计单词出现的次数
package main
import (
"fmt"
"strings"
)
func main() {
var str = "i am i am archer"
var strSlice = strings.Split(str, " ") //以”“ 空格分开,这里成了一个切片
fmt.Println(strSlice)
var strMap = make(map[string]int)
for _, v := range strSlice {
strMap[v]++ //k为字符串,v为int,遍历的时候strMap["遇到一次加一次,也相当于构建map数据]
}
fmt.Println(strMap)
}