go学习笔记map

定义

引用类型,哈希表,键必须是支持相等运算符类型。值可以是任意类型,没有限制
package main

import "fmt"

func main() {
    m := map[int]struct{
        name string
        age int
    }{
        1 : {"user1", 10},
        2 : {"user2", 20},
    }

    fmt.Println(m[1].name)
}
常见操作
package main

import "fmt"

func main() {
    m := map[string]int{    //判断key是否存在
        "a" : 1,
    }

    if v,ok := m["a"];ok {
        println(v, ok)      //1 true
    }

    fmt.Println(m["c"])     //0   对于不存在的key,直接返回\0,不报错
    m["b"] = 2              //新增或修改
    delete(m, "c")          //删除,如果key不存在,不会出错
    println(len(m))         //2    获取键值对数量。cap无效

    for k, v := range m {   //迭代,可仅返回key。随机顺序返回,每次都不相同
        println(k, v)       //b 2       a 1
    }
}
从map中取回的是一个value临时复制品,对其成员的修改是没有意义的
package main

import "fmt"

func main() {
   type user struct{ name string }
   m := map[int]user{
        1 : {"user1"},
   }

   fmt.Println(m[1].name)
   //m[1].name = "Tom"     //这样赋值会报错
   u := m[1]
   u.name = "Tom"
   m[1] = u
   fmt.Println(m[1].name)

   m2 := map[int]*user{
        1 : &user{"user1"},
   }
   m2[1].name = "jack"
   fmt.Println(m2[1].name)      //返回的是指针复制品,透过指针修改原对象是允许的
}
可以在迭代时安全删除键值,最好不要做新增操作
package main

import "fmt"

func main() {
    for i := 0; i < 5;i++ {
        m := map[int]string{
            0:"a", 1:"a", 2:"a", 3:"a", 4:"a",
            5:"a", 6:"a", 7:"a", 8:"a", 9:"a",
        }

        for k := range m {
            m[k+k] = "k"
            delete(m, k)
        }

        fmt.Println(m)
    }
}
坚持原创技术分享,您的支持将鼓励我继续创作!