MAP是一种无序的键值对的集合。
创建和初始化
- 使用make 声明映射
//创建一个映射,键的类型是string值的类型是 int
dict:=make(map[string]int)
//创建一个映射,并初始化
fruits:=map[string]string{
"durian":"榴莲","haw":"山楂","date":"枣",
}
fmt.Println(fruits)
map[date:枣 durian:榴莲 haw:山楂]
- 使用映射字面量声明空映射
创建map时,更常用的方法是使用映射字面量。映射的初始长度会根据初始化时键值对的数量来确定。
映射的键可以是任意值。这个值的类型可以是内置类型也可以是结构类型,只要这个值可以使用===运算符做比较。切片函数及包含结构类型的这些类型由于具有引用的语义,不能作为键。
//使用字符串切片作为值
value := []string{"I", "Love", "Golang"}
dict:=map[string] []string{}
dict["say"]=value
fmt.Println(dict)
map[say:[I Love Golang]]
获取键值对的个数 内置函数 len
n:=len(dict)
从map获取值,并通过该值判断键是否存在
- 法一
fruits:=map[string]string{
"durian":"榴莲","haw":"山楂","date":"枣","peach":"桃子",
}
banana:=fruits["banana"]
if banana!=""{
fmt.Println(banana)
}else {
fmt.Println("banana not exists")
}
peach:=fruits["peach"]
if peach!=""{
fmt.Println(peach)
}else {
fmt.Println("peach not exists")
}
banana not exists
桃子
- 法二
apples:=map[string]string{
"durian":"榴莲","haw":"山楂","date":"枣","peach":"桃子",
}
_,ok:=apples["apple"]
fmt.Println(ok)
false
用range迭代映射
MAP 所有键值用关键字range索引
fruits:=map[string]string{
"durian":"榴莲","haw":"山楂","date":"枣","peach":"桃子",
}
fmt.Println(fruits)
for key,value:=range fruits{
fmt.Printf("Key: %s,Value: %s\n",key,value)
}
Key: durian,Value: 榴莲
Key: haw,Value: 山楂
Key: date,Value: 枣
Key: peach,Value: 桃子
map中删除一个键值对 delete
使用内置的delete 函数
fruits:=map[string]string{
"durian":"榴莲","haw":"山楂","date":"枣","peach":"桃子",
}
//fmt.Println(apples)
for key,value:=range fruits{
fmt.Printf("Key: %s,Value: %s\n",key,value)
}
fmt.Println("***********")
delete (fruits,"peach")
for key,value:=range fruits{
fmt.Printf("Key: %s,Value: %s\n",key,value)
}
Key: peach,Value: 桃子
Key: durian,Value: 榴莲
Key: haw,Value: 山楂
Key: date,Value: 枣
***********
Key: date,Value: 枣
Key: durian,Value: 榴莲
Key: haw,Value: 山楂
注意
可以通过声明创建一个未初始化的map(nil MAP)
map 修改元素的值
- 直接修改
fruits["date"]="红枣"
- 间接修改
map是一种引用类型,如果两个map同时指向一个底层,如果一个改变,另一个也改变
fruits:=map[string]string{
"durian":"榴莲","haw":"山楂","date":"枣","peach":"桃子",
}
fruits_copy:=fruits
fruits_copy["date"]="红枣"
for key,value:=range fruits{
fmt.Printf("Key: %s,Value: %s\n",key,value)
}
Iteration order
获取所有键,
按照 key 排序:
import "sort"
var m map[int]string
var keys []int
for k := range m {
keys = append(keys, k)
}
sort.Ints(keys)
for _, k := range keys {
fmt.Println("Key:", k, "Value:", m[k])
}