GO map

map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。

map定义

语法:map[KeyType]ValueType
KeyType:表示键的类型。
ValueType:表示键对应的值的类型
map类型的变量默认初始值为nil,需要使用make()函数来分配内存。
语法:make(map[KeyType]ValueType, [cap])
cap表示map的容量,该参数虽然不是必须的

var a1 map[string]int
    fmt.Println(a1 == nil)  //true
    //初始化
    a := make(map[string]int,3)
    a["ares"] = 100
    a["ares1"] = 1000
    fmt.Println(a)  //map[ares:100 ares1:1000]

map声明的时候初始化

b := map[int]int{
        1:1,
        2:2,
    }
    fmt.Println(b) //map[1:1 2:2]

判断某个键是否存在

语法:value, ok := map[key]

//判断某个值是否存在
    c := map[string]int{
        "北京":80,
        "上海":70,
        "成都":90,
    }
    // 如果key存在ok为true,v为对应的值;不存在ok为false,v为值类型的零值
    v,ok := c["北京"]
    if ok{
        fmt.Println(v)  //存在 80
    }else{
        fmt.Println("不存在")
    }

map的遍历

使用for range遍历map。

//k,v遍历
    for k,v :=range c{
        fmt.Println(k,v)
    }
    输出:北京 80
        上海 70
        成都 90
    //只遍历map中的key
    for k := range c{
        fmt.Println(k)
    }
    输出:上海
        成都
        北京
    //只遍历map中的value
    for _,v := range c{
        fmt.Println(v)
    }
    输出:90
        80
        70

遍历map时输出的元素顺序与填充顺序无关,遍历是无序的!

按照指定顺序遍历map

var d = make(map[string]int,50)
    //添加10个键值对
    for i:=0;i<10;i++{
        key := fmt.Sprintf("test%02d",i)    //生成test开头的字符串
        value := rand.Intn(100)     //生成0-99的随机数
        d[key] = value
        //fmt.Println(key,value)
    }
    //按照key从大到小顺序遍历d
    //取出map中的key存入切片
    keys := make([]string,0,50)
    for k := range d{
        keys = append(keys,k)
    }
    //fmt.Println(keys)
    //对切片排序
    sort.Strings(keys)
    //fmt.Println(keys)
    //按照排序后的key遍历
    for _,v :=range keys{
        fmt.Println(v,d[v])
    }
    输出:
    test00 81
    test01 87
    test02 47
    test03 59
    test04 81
    test05 18
    test06 25
    test07 40
    test08 56
    test09 0
    //按照value排序
    values := make([]int,0,50)
    for _,v := range d{
        values = append(values,v)
    }
    sort.Ints(values)
    //fmt.Println(values)
    for _,v := range values{
        //fmt.Println(v)
        for k1,v1 :=range d{
            if v == v1{
                fmt.Println(k1,v1)
            }
        }
        输出:
        test09 0
        test05 18
        test06 25
        test07 40
        test02 47
        test08 56
        test03 59
        test00 81
        test04 81
        test00 81
        test04 81
        test01 87
    }

map的删除

delete() 函数用于删除集合的元素, 参数为 map 和其对应的 key。实例如下:

func main() {
    // 初始化map
    citymap := map[string]string {
        "bj":"bj",
        "shandong":"jinan",
        "sichuan":"chengdu",
        "jiangsu":"nanjing",
    }
    fmt.Println("原始map")
    for k,v := range citymap{
        fmt.Printf("province is:%v,shenghui is %v
",k,v)
    }
    //删除bj
    delete(citymap,"bj")
    fmt.Println("删除后map")
    for k,v := range citymap{
        fmt.Printf("province is:%v,shenghui is %v
",k,v)
    }
}
输出:
原始map
province is:shandong,shenghui is jinan
province is:sichuan,shenghui is chengdu
province is:jiangsu,shenghui is nanjing
province is:bj,shenghui is bj
删除后map
province is:sichuan,shenghui is chengdu
province is:jiangsu,shenghui is nanjing
province is:shandong,shenghui is jinan

元素为map类型的切片

//元素为map类型的切片
    var map1 = make([]map[string]string,5)  //切片的初始化
    for k,v :=range map1{
        fmt.Println(k,v)
    }
    //对切片中map元素进行初始化
    map1[0] = make(map[string]string,3)
    map1[0]["name"] = "ares"
    map1[0]["sex"] = "man"
    map1[0]["age"] = "22"
    for k,v := range map1{
        fmt.Println(k,v)
    }
    输出:
    0 map[name:ares sex:man age:22]
    1 map[]
    2 map[]
    3 map[]
    4 map[]

值为切片类型的map

//值为切片的map
    var map2 = make(map[string][]int,5) //只完成了map的初始化,因为值是个切片,所以初始化为[]int
    v,ok := map2["ares"]
    if ok{
        fmt.Println(v)
    }else{
        //map2没有ares这个键
        map2["ares"] = make([]int,5)    //切片初始化
        map2["ares"][0] = 1
        map2["ares"][1] = 1
        map2["ares"][2] = 1
    }
    for k,v :=range map2{
        fmt.Println(k,v)    //ares [1 1 1 0 0]
    }

统计字符串中单词出现次数

//统计单词出现次数
    var s = "what are you nong sha nong"
    //定义一个map
    var map3 = make(map[string]int,10)
    //字符串中有哪些单词,返回一个切片
    s1 := strings.Split(s," ")
    //fmt.Println(s1)
    //遍历单词做统计
    for _,v1 :=range s1{
        vv,ok :=  map3[v1]
        if ok{
            //map中有记录
            map3[v1] = vv+1
        }else{
            map3[v1] = 1
        }
    }
    for k,v := range map3{
        fmt.Println(k,v)
    }
    输出:
    what 1
    nong 2
    sha 1
    are 1
    you 1
原文地址:https://www.cnblogs.com/aresxin/p/GO-map.html