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 的值。

posted @ 2023-01-16 16:58  wushaoyu  阅读(371)  评论(0编辑  收藏  举报