美文网首页
第三节map

第三节map

作者: barriers | 来源:发表于2019-12-22 23:28 被阅读0次

    go中基本数据类型,int,float,bool,string,以及数组和struct都是值类型,其特点为变量直接存储值,内存通常在栈中分配,栈在函数调用完会被释放。
    指针,slice,map,chan等都是引用类型,其特点为变量存储的是一个地址,这个地址存储最终的值。内存通常在堆上分配,通过GC回收。

    1.类似其他语言中的哈希表或者字典,以key-value形式存储数据;
    2.key必须是支持==或!=比较运算的类型,不可以是函数、map或者slice(即必须是不可变类型);
    3.map查找比线性搜索快很多,但比使用索引访问数据的类型慢100倍;
    4.map使用make()创建,支持:=这种简写方式;
    5.make([key type]value type cap),cap表示容量,可省略;
    6.超出容量时会自动扩容,但尽量提供一个合理的初始值;
    7.使用len()获取元素个数;
    8.键值对不存在时自动添加,使用delete()删除某键值对;
    9.使用for range对map和slice进行迭代操作。
    10. map是引用类型数据
    内存地址编号为0x0的空间,为系统占用空间,不允许进行读写操作。

    判断值是否存在

    m = map[int]string{}
    m[1] = 'a'
    m[2] = 'b'
    # 判断值是否存在,存在则返回值和true;不存在则返回默认值(此处为'')和false
    value,ok:=m[100]
    
    import (
        "fmt"
    )
    
    func main(){
    // 定义map的三种方式
    // 定义变量
        var m map[int] string
        // 初始化的两种方式
        m = map[int]string{}
        m = make(map[int]string)
        fmt.Println(m,n)
        var a map[int]string = make(map[int]string)
        fmt.Println(a)
    
        b := make(map[int]string)
        fmt.Println(b)
    
    }
    

    2.1delete方法

    赋值:map[key]=value
    使用delete(map,key),如果key不存在,不会报错

    func main1(){
        b := make(map[int]string)
        b['a'] = "OK"
        a := b['a']
        delete(b, 'a')
        fmt.Println(b, a)
    }
    

    2.1.2嵌套map使用方法

    嵌套map即map的value仍然为map,有多少层就要初始化多少次;

    func main1(){
        var m map[int]map[int]string
        m = make(map[int]map[int]string)
        // ok为布尔值,存在key为true,否则为false
        a, ok := m['a']['a']
        if !ok {
            m['a'] = make(map[int]string)
        }
        
        m['a']['a'] = "OK"
        fmt.Println(m, ok)
    }
    

    2.1.3迭代操作

    切片迭代

    func main2(){
        sl:= [12] int{1,2,3,4,5}
        slice := sl[:5]
        for i,v:=range slice{
        fmt.Println(i, v)
        }
    }
    

    map迭代

    func main2(){
        slice:= make(map[int]string)
        for k,v:=range slice{
        fmt.Println(k, v)
        }
    }
    

    切片中嵌套map(跟py中列表嵌套字典一样)
    先用make创建切片,切片创建方式make([]type,len,cap),其中cap可以省略

    func main2(){
        sm := make([]map[int]string,5)
        for i := range sm {
            sm[i] = make(map[int]string, 1)
            sm[i][1] = "OK"
            fmt.Println(sm[i])
        }
        fmt.Println(sm)
    }
    

    利用切片对map中的key进行排序

    func main2(){
        m := map[int]string{1:"a", 2:"b", 3:"c",4:"d", 5:"e"}
        s := make([]int, len(m))
        i := 0
        for key:=range m{
            s[i] = key
            i++)
        }
        sort.Ints(s)
        fmt.Println(s)
    }
    

    键值对互换

    func main2(){
        m := map[int]string{1:"a", 2:"b", 3:"c",4:"d", 5:"e"}
        l := map[string]int {}
        for key,value:=range m{
            l[value] = key
        }
        fmt.Println(l)
    }

    相关文章

      网友评论

          本文标题:第三节map

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