Golang 中的map是怎样的

330 阅读3分钟

0. 前言

map 这种结构,在很多语言中都会存在,他的作用也是非常大的,map是key-value数据结构,又称为字段或者关联数组。golang的maphashmap,是使用数组+链表的形式实现的,使用拉链法消除hash冲突。

golang中的map,的key可以是很多种类型,比如booL,数字,string,指针,channel,还可以是只包含前面几个类型的接口,结构体,数组通常key为int、string

注意:slice,map还有function不可以,因为这几个没法用=来判断

1. 声明

  • var a mapstring]string
  • var a map[string]int
  • var a map[int]string
  • var a map[string]map[string]string

声明是不会分配内存的,初始化需要make,分配内存后才能赋值和使用。

package main
import (
    "fmt"
)

func main(){
    var a map[string]string
    a make(map[string]string,10)
    a["no1"]="宋江"
    a["no2"]="吴用"
    a["no1"]="武松”
    a["no3"]="吴用"
    fmt.Println(a)
}
  • map在使用前一定要make
  • map的key是不能重复,如果重复了,则以最后这个key-value为准
  • map的value是可以相同的,
  • map的key-value是无序
  • make内置函数数目

2. 使用

增加和更新

map["key"] = value // 如果key还没有,就是增加,如果key存在就是修改。

func main(){
    cities :make(map[string]string)
    cities["no1"]="北京
    cities["no2]="天津"
    cities["no3]="上海
    fmt.Println(cities)
    
    // 因为no3这个key已经存在,因此下面的这句话就是修改
    cities["no3]"上海~"
    fmt.Println(cities)
}

删除

delete(map,"key")

delete是一个内置函数,如果key存在,就删除该key-value,如果key不存在,不操作,但是也不会报错

func main(){
    delete(cities,"nol")
    fmt.Println(cities)
    
    //当delete指定的key不存在时,剔除不会操作,也不会报错
    delete(cities,"no4")
    fmt.Println(cities)
}

注意:如果我们要删除map的所有key,没有一个专门的方法一次删除,可以遍历一下key,逐个删除或者map=make(),make一个新的,让原来的成为垃圾,被gc回收

查找

func main(){
    val,ok :cities["no2"]
    if ok
        fmt.Printf("有no1key值为%wn',val)
    else
        fmt.Printf("设有no1key叭n)
}

如果heroes这个map中存在"nol",那么findRes就会返回true,否则返回false

3. 遍历

map的遍历很简单,遍历map时的元素顺序与添加键值对的顺序无关。在使用map前,需要先定义make,make的作用就是给map分配空间。map是引用类型,遵守引用类型传递的机制,在一个函数接收map,修改后会直接修改原来的map。map的容 量达到后,再想map增加元素,会自动扩容,并不会发生panic也就是说map能动态的增长键值对(key-value)。map的value 也经常使用struct类型,更适合管理复杂的数据。

案例

package main
import (
    "fmt"
)

func main(){
    cities :make(map[string]string)
    cities["no1"]="北京"
    cities["no2"]="天津
    cities["no3"]="上海”
    for k,v:=range cities{
        fmt.Printf("k=%vv=%v\n",k,v)
    }
   
    studentMap :make(map[string]map[string]string)
    studentMap["stue1"] = make(map[string]string,3)
    studentMap["stue1"]["name" ]= "tom'
    studentMap["stuo1"]["sex"j = "男”
    studentMap[”stuo1"]["address"] = "北京长安街~"
    studentMap[”stuo2"] = make(map[string]string,3)
    
    studentMap["stu02"]["name"] = "mary"
    studentMap["stu02"]["sex"] = "女"
    studentMap["stuo2"]["address"]="上海黄浦江"
    
    for k1,11 :range studentMap{
        fmt.Println("k1=",k1)
        for k2,v2 :range v1{
            fmt.Printf("\t k2=%v v2=%v\n",k2,v2)
        }
        fmt.Println()
    }
}

本文正在参加技术专题18期-聊聊Go语言框架