map是一堆键值对的未排序集合,比如以身份证号作为唯一键来标识一个人的信息。
map是引用类型,键必须支持相等运算符(==,!=)类型,比如:int,string,float等内建类型,只含有内建类型的结构体可以作为key。值可以是任意类型,没有限制。
初始化
package main
import (
"fmt"
)
func main() {
//第一种方式
var a map[string]string
a = make(map[string]string, 10)
a["no1"] = "松江"
a["no2"] = "无用"
fmt.Println(a) //map[no1:松江 no2:无用]
//第二种方式
cities := make(map[string]string)
cities["no1"] = "北京"
cities["no2"] = "田间"
cities["no3"] = "上海"
fmt.Println(cities) //map[no1:北京 no2:田间 no3:上海]
//第三种方式
// var heros map[string]string = map[string]string {}
heroes := map[string]string{
"hero1": "松江",
"heros": "武松",
}
fmt.Println(heroes) //map[hero1:松江 heros:武松]
}
map作为参数传递给函数的代价非常的小,一般在32位位的机器上只需要4字段,64位的机器上需要8字节,并且无论是多少数据,在 map 中通过 key 查找对应的 value 非常的快的。
我们使用 map 的时候,如果事先知道元素所存数量的大小,我们我可能过 make 函数预先给一个合理的数,有助于提升性能,因为事先申请了一大块内存,可以避免后续操作时频繁扩张。
m := make(map[string]string,100)
增删改查
package main
import (
"fmt"
)
func main() {
cities := make(map[string]string)
cities["no1"] = "太原"
cities["no2"] = "河南"
cities["no3"] = "颍川"
fmt.Println(cities)
// 1、修改,若key存在则修改,若不存在则增加
cities["no3"] = "武汉"
// 2、删除,使用内置函数delete
delete(cities,"no1")
//指定key不存在是不会操作也不会报错
delete(cities,"no4")
// 3、查找
val,findStatus := cities["no2"]
if findStatus {
fmt.Println("找到了no2,val=",val)
} else {
fmt.Println("没有这个key")
}
fmt.Println(cities)
//一次性删除所有的key
//1.遍历所有的key删除
//2.重新make一个新的
cities = make(map[string]string)
fmt.Println(cities)
}
map遍历
map结构的数据需使用for-range去遍历。
1、简单遍历
package main
import (
"fmt"
)
//说明:map的遍历需要使用for-range
func main() {
cities := make(map[string]string)
cities["no1"] = "太原"
cities["no2"] = "河南"
cities["no3"] = "颍川"
fmt.Println(cities) //map[no1:太原 no2:河南 no3:颍川]
for k, v := range cities {
fmt.Printf("k=%v,v=%v\n", k, v)
}
/*
k=no1,v=太原
k=no2,v=河南
k=no3,v=颍川
*/
}
2、复杂遍历
package main
import (
"fmt"
)
//说明:map的遍历需要使用for-range
func main() {
//for-range遍历一个较复杂的map
msg := make(map[string]map[string]string)
msg["1"] = make(map[string]string)
msg["1"]["name"] = "tom"
msg["1"]["age"] = "12"
msg["2"] = make(map[string]string)
msg["2"]["name"] = "jack"
msg["2"]["age"] = "14"
msg["3"] = make(map[string]string)
msg["3"]["name"] = "mary"
msg["3"]["age"] = "15"
fmt.Println(msg)
for k1, v1 := range msg {
fmt.Println("k1=", k1)
for k2, v2 := range v1 {
fmt.Printf("\t k2=%v,v2=%v\n", k2, v2)
}
fmt.Println()
}
fmt.Printf("cities有%d个key-value", len(cities))
/*
map[1:map[age:12 name:tom] 2:map[age:14 name:jack] 3:map[age:15 name:mary]]
k1= 2
k2=name,v2=jack
k2=age,v2=14
k1= 3
k2=name,v2=mary
k2=age,v2=15
k1= 1
k2=name,v2=tom
k2=age,v2=12
cities有3个key-value
*/
}
Map 是无序的,但是有时候,我们想有序的取到 map 内部的值,所以我们只能通过对key进行排序,然后再通过key的值取对应value 的值。