golang map的定义与使用
Map
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 的值。