Fork me on GitHub

Go语言之map

一、map简介

map是key-value的数据结构,基本语法:var map 变量名 map[keytype]valuetype。

keytype可以是很多种数据类型,比如 bool、int、string、指针等,通常keytype为int和string。valuetype和keytype差不多,通常valuetype为int、string、map、struct。

举例:

var a map[int]string // key是int类型,value是string类型
var a map[string]int // key是string类型,value是int类型
var a map[string]string // key是string类型,value是string类型
var a map[string]map[string]string // key是string类型,value是map类型

 注意:声明是不会分配内存,初始化需要make,分配内存后才能赋值和使用。

package main

import "fmt"

func main()  {
    // 声明map
    var a map[string]string

    // 在使用map前需要使用make分配空间
    a = make(map[string]string, 10)
    a["username"] = "张三"
    a["addr"] = "张家界"

    fmt.Println(a) // map[addr:张家界 username:张三]
}
  • map在使用前一定要make
  • map的key是不能重复的,如果重复了,以最后一个key-value为准
  • map的value可以重复
  • map的key-value是无序的

二、map的创建

1、方式一

package main

import "fmt"

func main()  {

    // 创建map的方式一 先进行make
    var m1 map[string]string
    m1 = make(map[string]string, 10)
    m1["usernamae"] = "张三"
    m1["password"] = "abc123456"
    fmt.Println(m1)

}

2、方式二

package main

import "fmt"

func main()  {
    
    // 创建map的方式二
    m2 := make(map[string]string)
    m2["usernamae"] = "张三"
    m2["password"] = "abc123456"
    fmt.Println(m2)

}

3、方式三

package main

import "fmt"

func main()  {
    
    // 创建map的方式三
    m3 := map[string]string{
        "username": "张三",
        "password": "abc123",
    }
    fmt.Println(m3)

}

三、map的增、删、查、改

1、增加和修改

package main

import "fmt"

func main()  {
    
    user := map[string]string{
        "username": "iveBoy",
    }

    // 增加,如果key没有,就是增加
    user["password"] = "abc123456"

    // 修改,如果key存在,就是修改
    user["username"] = "lily"

    fmt.Println(user)

}

2、删除

delete(map, "key"),delete是一个内置函数,如果key存在,就删除该key-value,如果key不存在,不操作并且也不会报错。

package main

import "fmt"

func main()  {
    user := map[string]string{
        "username": "iveBoy",
        "gender": "male",
    }

    // 删除键值
    delete(user, "gender")
    fmt.Println(user) // map[username:iveBoy]

    //  删除不存在的键, 删除不操作,也不会报错
    delete(user, "hobby")
    fmt.Println(user)
}

如果需要清空整个map,通过:

  • 循环一个个删除
  • make一个新的map,让之前的那个成为垃圾,gc进行回收

3、查找

package main

import "fmt"


func main()  {
    
    user := map[string]string{
        "username": "iveBoy",
        "gender": "male",
    }

    val, isFlag := user["username"]

    fmt.Println(val, isFlag) // iveBoy true
}

如果user中存在username这个键,isFlag就是true,否则就为false。

对于map的遍历:

package main

import "fmt"

func main()  {
    
    // 声明一个map

    user := map[string]string{

        "username": "iveBoy",
        "gender": "male",
    }

    for k, v := range user {
        fmt.Printf("k=%v v=%v\n", k, v)
    }
    /*
    k=username v=iveBoy
    k=gender v=male
    */

}

如果计算map的长度可以通过len方法进行获取,len(user)。

四、map切片

之前学习过数组切片,那么map切片应该就知道是什么意思了,对的,通过map切片可以使map的个数动态变化。举个例子,一个班级有很多学生,而每个学生有自己的姓名、性别等信息,那么班级可以定义成一个切片,每个学生就是一个map。

package main

import "fmt"

func main()  {
    
    // 定义切片
    class := make([]map[string]string, 2) //可以放入2个学生信息

    // 增加第一个学生,先提前判断是否存在这个map
    if class[0] == nil {
        class[0] = make(map[string]string)
        class[0]["name"] = "张三"
        class[0]["gender"] = "男"
    }

    // 增加第二个学生,先提前判断是否存在这个map
    if class[1] == nil {
        class[1] = make(map[string]string)
        class[1]["name"] = "李四"
        class[1]["gender"] = "男"
    }

    // 此时只能动态添加map了,否则会越界
    newStu1 := map[string]string{
        "name": "王五",
        "gender": "男",
    }

    class = append(class, newStu1)

    fmt.Println(class)
    
    /*
    [map[gender:男 name:张三] map[gender:男 name:李四] map[gender:男 name:王五]]
    */

}

五、map其它注意事项

1、map排序

golang中没有专门的方法针对map的key进行排序,所以map是无序的,如果想让其有序可以先将map的key放入切片中进行排序,然后对应输出对应的value。

package main

import (
    "fmt"
    "sort"
    )

func main()  {
    
    m1 := make(map[int]int, 5)
    m1[1] = 5
    m1[3] = 10
    m1[0] = 60

    // 定义一个切片
    var keys []int

    for k, _ := range m1{
        keys = append(keys, k)
    }

    // 对key进行排序
    sort.Ints(keys)

    fmt.Println(keys)

    // 根据key输出value
    for _, k := range keys{
        fmt.Println("value=", m1[k])
    }
    

}

2、map引用类型

map是引用类型,如果函数参数是map类型,那么在函数里面修改的map,外面也会发生变化。

package main

import "fmt"

func modifyValue(m map[int]int)  {
    m[1] = 10
}

func main()  {
    
    m2 := map[int]int{
        1: 6,
        2: 9,
    }

    // 修改map值
    modifyValue(m2)

    fmt.Println(m2)
    /* map[1:10 2:9] */
}

 

posted @ 2022-01-15 11:53  iveBoy  阅读(288)  评论(0编辑  收藏  举报
TOP