Golang基础_05-map

Posted leafs99

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang基础_05-map相关的知识,希望对你有一定的参考价值。

目录

@

简介

  • 类似其他语言的哈希表或者字典,以key-value的形式存储数据
  • key必须支持==或者!=比较运算的类型,不能是函数,map或者slice(他们都不支持),但是value可以呀,嘿嘿
  • map查找比线性搜索快很多,但比使用索引访问数据的类型慢100倍(array,slice)

    声明定义初始化

  • map支持使用make()创建,也可以用传统方式创建支持:=这种简写形式
  • make([keyType]valueType, cap),cap是容量,可省略
  • 超过容量会自动扩容,但是尽量使用合适的初始值
  • 使用len() 获取元素个数
  • 键值对不存在就自动添加,使用delete(map,key)删除某个键值对

func main()
    var m map[int]string = map[int]string
    var mm map[int]string = make(map[int]string)
    mmm := make(map[int]string)
    m[1] = "ok"
    a := m[1]
    fmt.Println(m,a,mm,mmm)
    delete(m,1)
    fmt.Println(m,a)

/*
> Output:
command-line-arguments
map[1:ok] ok map[] map[]
map[] ok
*/

复杂map

func main()
    var m map[int]map[int]string
    m = make(map[int]map[int]string)
    //这里记得里面的value对应的map也要初始化
    a, ok := m[2][1]
    if !ok 
        m[2] = make(map[int]string)
    
    m[2][1]="GOOD"
    a,ok = m[2][1]
    fmt.Println(a, ok)

/*
> Output:
command-line-arguments
GOOD true
*/

map和slice的迭代操作

/*
    for i,v:=range slice/map

    */
    //如果是slice : i是索引,int型,v是其对应的值的拷贝,对v的任何操作都不会影响slice
    //如果是map : i,v对应键值对,对v的任何操作都不会影响map
func main()
    sm := make([]map[int]string, 5)
    for _, v := range sm 
        v = make(map[int]string, 1)
        v[1]="ok"
        fmt.Println(v)
    
    fmt.Println(sm)
    for i := range sm 
        sm[i] = make(map[int]string, 1)
        sm[i][1] = "not ok"
        fmt.Println(sm[i])
    
    fmt.Println(sm)

/*
> Output:
command-line-arguments
map[1:ok]
map[1:ok]
map[1:ok]
map[1:ok]
map[1:ok]
[map[] map[] map[] map[] map[]]
map[1:not ok]
map[1:not ok]
map[1:not ok]
map[1:not ok]
map[1:not ok]
[map[1:not ok] map[1:not ok] map[1:not ok] map[1:not ok] map[1:not ok]]
*/

利用slice对map进行间接排序

  • map是无序的
  • 引入包sort,使用sort.Ints()函数
func main()
    m := map[int]string1:"a",2:"b",3:"c",4:"d",5:"f",6:"g"
    s := make([]int, len(m))
    i := 0
    for k,_ := range m 
        s[i] = k
        i++
    
    sort.Ints(s)
    for _,v := range s 
        fmt.Println(m[v])
    
    fmt.Println(s)

/*
> Output:
command-line-arguments
a
b
c
d
f
g
[1 2 3 4 5 6]
*/

例子:交换key和value

func main()
    m := map[int]string1:"a",2:"b",3:"c",4:"d",5:"f",6:"g"
    mm := make(map[string]int,len(m))
    for k,v := range m 
        mm[v]=k
    
    fmt.Println(m)
    fmt.Println(mm)

/*
> Output:
command-line-arguments
map[5:f 6:g 1:a 2:b 3:c 4:d]
map[f:5 g:6 a:1 b:2 c:3 d:4]
*/

以上是关于Golang基础_05-map的主要内容,如果未能解决你的问题,请参考以下文章

Golang基础_08-方法method

Golang基础_10-反射reflection

Golang基础_05-map

Golang基础_11-并发concurrency

Golang基础_07-结构struct

Golang基础_06-函数function