zoukankan      html  css  js  c++  java
  • GO基础之Map

    go开发手册:   https://studygolang.com/pkgdoc

     一、什么是map

    有资料翻译成地图、映射或字典。但是大多数习惯上翻译成集合。
    1、map是Go中的内置类型,它将一个值与一个键关联起来。可以使用相应的键检索值。

    • map是一种无序的键值对(key-value pair)的集合。map通过key来快速检索数据,key类似于索引,指向相应的value值。
    • map是一种集合,所以可以像遍历数组或切片那样去遍历它,不过map是无序的,所以无法决

    2、使用map的注意细节:
    • map是无序的,每次打印出来的map都会不一样,它不能通过index获取,而必须通过key获取;
    • map的长度是不固定的,和slice-样可以扩展。内置的len()函数同样适用于map,返回map拥有的键值对的数量。但是map不能通过cap()函数计算容量(或者说cap()函数的参数不可以是map);
    •同_tmap中key必须保证唯_。key的数据类型必须是可参与比较运算的类型,也就是支持==或!=操作的类型。如布尔型、整数型、浮点型、字符串型、数组。对于切片、函数等引用类型则不能作为键的类型;

    (Invalid map key type: must not be must not be a function , map or slice)
    • map的value可以是任何数据类型。
    •和slice—样,map也是一种引用类型;

    二、map的使用

    1、map的声明

    map中key可以是:int、float、bool、string、数组;    一定不可以是:切片、函数、map

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        //map的声明 一(var 变量名 map[key的类型]value的类型 )
        var map1 map[string]string
        fmt.Printf("%T,%v,%v 
    ", map1, map1, map1 == nil) //map[string]string,map[],true
        //map声明 二
        map2 := make(map[string]string)
        fmt.Printf("%T,%v,%v 
    ", map2, map2, map2 == nil) //map[string]string,map[],false
    }

    2、map的初始化

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        //map的声明 一(var 变量名 map[key的类型]value的类型 )
        var map1 map[string]string
        fmt.Println("map的长度", len(map1))
        //在声明的同时初始化数据
        var map2 = map[string]string{
            "sz": "张三",
            "ls": "李四",
        }
        fmt.Println("map=", map2)
        
        //先声明 然后再赋值
        map3 := make(map[string]string)
        map3["ww"] = "王五"
        map3["lb"] = "刘备"
        fmt.Println("map=", map3)
    }

    3、map的CURD

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        //=========在声明的同时初始化数据
        var map2 = map[string]string{
            "zs": "张三",
            "ls": "李四",
        }
        //=========map添加数据
        map2["lb"] = "刘备"
    
        //=========map的遍历
        for k, v := range map2 {
            fmt.Println("k=", k, " v=", v)
        }
        //=========根据key检测值是否存在
        v, ok := map2["sz"]
        fmt.Println("v=", v, " ok=", ok) //v= 张三  ok= true
        v1, ok1 := map2["sssss"]
        fmt.Println("v=", v1, " ok=", ok1) //v=   ok= false
        if value, key := map2["lb"]; key {
            fmt.Println("元素的值=", value)
        }
        //=========修改map中key对应的value
        map2["zs"] = "zhangshan"
        fmt.Println("update=", map2)
    
        //=========delete 删除map中的元素
        //该函数没有返回值,如果删除不存在的key程序不会报错
        fmt.Println("delete befor=", map2)
        delete(map2, "lb")
        delete(map2, "HHHHHHHHHHHHHH")
        fmt.Println("delete after=", map2)
        //=========清空map (go语言没有清空的函数,如果要清空,就是直接赋新的map)
        map2 = map[string]string{}
        //map2 = make(map[string]string)
        fmt.Println("clear=", map2)
    
        //map是引用类型
        
    }

    4、map是引用类型

    package main
    
    import (
        "fmt"
        "container/list"
    )
    
    func main() {
        //初始薪资
        salary := map[string]float64 {
            "Steven":15000,
            "Josh":20000,
            "Daniel":5000,
        }
        fmt.Println("初始薪资",salary)
    
        //调薪后
        newSalary := salary
        newSalary["Daniel"] = 8000
        fmt.Println("调薪后:" , newSalary)
        fmt.Println("原始薪资salary是否受影响:" , salary)
    
        //定期涨薪
        changeSalary(salary)
        fmt.Println("原始薪资salary是否受影响:" , salary)
    }
    
    //定期涨薪
    func changeSalary(m map[string]float64) {
        for k :=range m {
            m[k] *= 1.1
        }
    }
  • 相关阅读:
    微信公众号开发问题总结(坑)
    map 取值报空指针,明明值存在
    关于客户端Socket连接服务端,客户端只有在服务端关闭后才收到数据的问题
    关于Spine动画,关于cocosCreator
    cocsoCreator实现镜头跟随节点移动
    cocos节点添加Touch监听代码
    使用git管理你的代码,使用git托管代码至gitee
    关于ccoosCreator里的物理系统
    Python Scrapy 爬虫简单教程
    quasar 参考文档
  • 原文地址:https://www.cnblogs.com/jalja/p/11785336.html
Copyright © 2011-2022 走看看