美文网首页
Golang——map

Golang——map

作者: Cici冬雪 | 来源:发表于2020-05-21 21:41 被阅读0次

    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)
    
    } 
    

    相关文章

      网友评论

          本文标题:Golang——map

          本文链接:https://www.haomeiwen.com/subject/pmuiohtx.html