Golang——map

Map无序的、基于key-value的数据结构,内部使用散列表hash实现。
Map是引用类型,声明时是nil,必须初始化才能使用

map[keytype]valuetype

map类型变量默认初始值是nil,需要使用make()函数进行初始化

make(map[keytype]valuetype, [cap])

map声明和初始化

func main() {
    //声明
    var a map[string]int
    fmt.Println(a == nil)    //true

    //初始化,容量可以写,建议编程时候加上
    a = make(map[string]int, 10)
    fmt.Println(a == nil)    //false

    // 声明map并初始化
    b := map[int]string{
        1:"a",
        2:"b",
    }
    fmt.Println(b)           //map[1:a 2:b]

}

map使用(添加key-value、删除key、判断是否存在、遍历)

func main() {
    var a map[string]int
    a = make(map[string]int, 10)
    
    //添加key-value
    a["a"] = 1
    a["b"] = 2
    fmt.Println(a)              // map[a:1 b:2]
    fmt.Printf("%#v\n", a)      // map[string]int{"a":1, "b":2}
    fmt.Printf("type:%T\n", a)  //map[string]int

    //删除key-value
    delete(a, "a")
    fmt.Println(a)              //map[b:2]

    //判断key是否存在
    var c = make(map[string]int, 5)
    c["a"] = 1
    c["b"] = 2

    v, ok := c["c"]
    fmt.Println(v, ok)  
    if ok {
        fmt.Println("key=c存在,value=", v)
    } else {
        fmt.Println("key=c不存在")
    }

    //map遍历,跟添加的key顺序无关
    for key, value := range c {
        fmt.Println(key, value)
    }

    //只遍历map中的key
    for key := range c {
        fmt.Println(key)
    }

    //只遍历map中的value
    for _, value := range c {
        fmt.Println(value)
    }

    //按照固定顺序固定遍历map
    var e = make(map[string]int, 100)
    for i := 0; i < 50; i++ {
        key := fmt.Sprintf("stu%02d", i)
        //生成0~99随机整数
        value := rand.Intn(100)
        e[key] = value
    }
    fmt.Println(e)

    //按照key从小到大的顺序去遍历map
    keys := make([]string, 0, 100)
    for key := range e {
        keys = append(keys, key)
    }
    //内置函数进行排序
    sort.Strings(keys)
    for _, key := range keys {
        fmt.Println(key, e[key])
    }

}

元素为map的切片

func main() {
    //元素为map的切片
    //切片初始化
    var a = make([]map[string]int, 5, 10)
    fmt.Println(a[0] == nil)         //true
    //内部map的初始化
    a[0] = make(map[string]int, 5)
    a[0]["a"] = 1
    fmt.Println(a)                   //[map[a:1] map[] map[] map[] map[]]
}

值为切片的map

func main() {
    //值为切片的map
    var b = make(map[string][]int, 5)
    v, ok := b["a"]
    if ok {
        fmt.Println(v)            
    } else {
        //对切片的初始化
        b["a"] = make([]int, 5)
        b["a"][0] = 100
        b["a"][1] = 200
        b["a"][2] = 300
        fmt.Println(b)                  //map[a:[100 200 300 0 0]]
    }   
}

小练习:统计一下每个单词出现次数

func main() {
    //统计一下每个单词出现次数,例如 how do you do
    str := "how do you do"
    fmt.Println(str)    
    
    s := strings.Split(str, " ")
    fmt.Println(s)

    wordCount := make(map[string]int, 10)
    for _, eachWord := range s {
        fmt.Println(eachWord)
        v, ok := wordCount[eachWord]
        fmt.Println(v, ok)
        if ok {
            wordCount[eachWord] += 1
        } else {
            wordCount[eachWord] = 1
        }
    }
    
    fmt.Println(wordCount)

} 

发表评论

您的电子邮箱地址不会被公开。