第三节map

2019-12-22  本文已影响0人  barriers

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)
}
上一篇下一篇

猜你喜欢

热点阅读