go 语言入门指南:基本语法和常用特性解析3|青训营

99 阅读3分钟

go语言基础学习(map)

map介绍

map是key-value的数据结构,又称为字段或者关联数组,类似其他编程语言的集合

基本语法

var map变量名 map[keytype] valueType

key可以是什么类型?

golang中的map,key可以是多种类型的。比如bool,int,string,指针,channel,还可以是包含前面几个类型的接口,结构体、数组。通常为int,string 注意:slice,map中还有function不可以,因为这几个没法用==来判断 map声明的案例:

var a map[string]string  
var a map[string] int  
var a map[int]string  
var a map[int] map[int] string
func main() {  
    var a map[string]string  
    //a["num1"] = "111" //panic: assignment to entry in nil map  
    // 在使用前需要先make,分配空间  
    a = make(map[string]string, 10)  
    a["n1"] = "测试"  
    fmt.Println(a)  
  
}

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

map的使用

三种使用方式

func main() {  
    var a map[string]string  
    //a["num1"] = "111" //panic: assignment to entry in nil map  
    // 在使用前需要先make,分配空间  
    a = make(map[string]string, 10)  
    a["n1"] = "测试"  
    fmt.Println(a)  
    //第二种  
    cities := make(map[string]string)  
    cities["n01"] = "背景"  
    cities["n02"] = "上海"  
    fmt.Println(cities)  
    //第三种  
    heroes := map[string]string{  
    "hero1": "孙悟空",  
    "hero2": "唐增",  
    }  
    fmt.Println(heroes)  
  
}

map的增删改查操作

cities := make(map[string]string)  
cities["n01"] = "背景"  
cities["n02"] = "上海"  
cities["n03"] = "天津"  
fmt.Println(cities)  
//修改操作  
cities["n03"] = "广州"  
fmt.Println(cities)  
//删除  
delete(cities, "n01")  
fmt.Println(cities)  
//指定的key不存在  
delete(cities, "n04")  
fmt.Println(cities)  
//查询  
val, ok := cities["n02"]  
if ok {  
fmt.Println(val)  
} else {  
fmt.Println("没有n01对应的key")  
}  
//如果希望一次性删除所有的key  
//1. 遍历所有的key,然后逐一删除[遍历]  
//2.直接make新的空间  
cities = make(map[string]string)  
fmt.Println(cities)

map的遍历

map的遍历使用for-range的结构进行遍历的

func main() {  
  
    cities := make(map[string]string)  
    cities["n01"] = "背景"  
    cities["n02"] = "上海"  
    cities["n03"] = "天津"  

    for k, v := range cities {  
    fmt.Printf("k=%s and v=%s\n", k, v)  
    }  
}

image.png

map切片

切片的数据类型如果是map,就是map切片,map的个数可以动态的变化

func main() {  
  
    //声明一个map切片  
    var monsters []map[string]string  
    monsters = make([]map[string]string, 2)  
    //增加信息  
    if monsters[0] == nil {  
    monsters[0] = make(map[string]string, 2)  
    monsters[0]["name"] = "牛魔王"  
    monsters[0]["age"] = "35"  
    }  

    if monsters[1] == nil {  
    monsters[1] = make(map[string]string, 2)  
    monsters[1]["name"] = "红孩儿"  
    monsters[1]["age"] = "15"  
    }  
    //切片的append函数,可以动态的增加元素  
    monsterNew := map[string]string{  
    "name": "玉兔精",  
    "age": "12",  
    }  
    monsters = append(monsters, monsterNew)  
    fmt.Println(monsters)  
  
}

输出:

image.png

map的排序

1)golang中没有一个专门的方法对map的key进行排序 2)golang中的map默认是无序的,注意也不是按照添加的顺序排序的,每次遍历得到的输出可能不一样 3)golang中的map排序,是先将key进行排序,然后根据key的值,遍历输出即可

*说明:这一部分排序的功能,不同版本的go是不一样的。1.18版本是支持的。 *

func main() {  
    //map的排序  
    map1 := make(map[int]int, 10)  
    map1[10] = 100  
    map1[1] = 12  
    map1[2] = 8  
    map1[3] = 19  
    map1[4] = 1  
    fmt.Println(map1)  
    //如何按照map的key的顺序进行排序输出  
    //1.先将map的key放入到切片中  
    //2.对切片进行排序  
    //3.遍历切片,然后按照key的值输出map  
    var keys []int  
    keys = make([]int, len(map1))  
    for k, _ := range map1 {  
        keys = append(keys, k)  
    }  
    //排序  
    sort.Ints(keys)  
    fmt.Println(keys)  

    for _, k := range keys {  
        fmt.Println(map1[k])  
    }  
}

输出:

image.png

map的使用细节:

1) map是引用类型,遵循引用类型传递的机制,在一个函数接口map,修改后会直接修改原来的map

image.png 2) map的容量达到后,再想map增加元素,会自动扩容,并不会发生panic,也就是说map可以动态的增长键值对

3)map的value也经常使用struct类型,更适合管理复杂的数据

image.png