slice和map的区别

slice是数组的形式,map是哈希的key、value形式类似于python中的列表和字典的关系。

声明map

第一种声明方式(先声明,再分配,再赋值)


package main

import "fmt"

func main() {
    // 声明一个map,它的key为string类型,value是string类型
    var myMap1 map[string]string
    if myMap1 == nil {
        fmt.Println("myMap1是一个空map")
    }
    // 在使用map前,需要先用make给map分配数据空间,因为无法调用空的map
    myMap1 = make(map[string]string, 10)
    // 赋值
    myMap1["one"] = "python"
    myMap1["two"] = "c"
    myMap1["three"] = "php"

    fmt.Println(myMap1)
}

运行结果:
image.png
可以看到打印出来的map看起来是乱序的,原因存在于map的排序采用了对key使用hash算法。

第二种声明方式(声明并且分配,再赋值)

    myMap2 := make(map[int]string) // 将声明和分配空间合并在一起,并且可以省略分配的容量,让其自动分配
    // 赋值
    myMap2[1] = "python"
    myMap2[2] = "c"
    myMap2[3] = "php"
    fmt.Println(myMap2)

运行结果:
image.png

第三种声明方式(声明分配赋值一起)

    myMap3 := map[string] string {
        "one": "php",
        "two": "java",
        "three": "c++",
    }
    fmt.Println(myMap3)

运行结果:
image.png

使用map

增删改查

cityMap := make(map[string]string)
    // 赋值
    cityMap["China"] = "Beijing"
    cityMap["Japan"] = "Tokyo"
    cityMap["USA"] = "NewYork"

    // 遍历
    for key, value := range cityMap {
        fmt.Println("key = ",key)
        fmt.Println("value = ",value)
    }

    // 删除
    delete(cityMap, "China") // delete函数,第一个参数为操作的对象,第二个参数为key

    // 修改
    cityMap["USA"] = "我心疼DC"
    fmt.Println("==================")

    // 遍历
    for key, value := range cityMap{
        fmt.Println("key = ",key)
        fmt.Println("value = ",value)
    }

运行结果:
image.png

map作为函数的参数

package main

import "fmt"

func printMap(cityMap map[string]string) {
    // 是引用传递,传递的是指针
    for key, value := range cityMap{
        fmt.Println("key = ",key)
        fmt.Println("value = ",value)
    }
}

func main() {
cityMap := make(map[string]string)
    // 赋值
    cityMap["China"] = "Beijing"
    cityMap["Japan"] = "Tokyo"
    cityMap["USA"] = "NewYork"

    // 遍历
    printMap(cityMap)

    // 删除
    delete(cityMap, "China") // delete函数,第一个参数为操作的对象,第二个参数为key

    // 修改
    cityMap["USA"] = "我心疼DC"
    fmt.Println("==================")

    // 遍历
    printMap(cityMap)
}
  • 2-10行声明函数,将map作为参数,用来遍历map中的元素
  • 第20、第30行调用遍历的函数,cityMap作为参数

运行结果:
image.png

可以看到遍历函数打印了cityMap中的元素。
注意:这里的函数传递的map参数是引用传递,也就是指针指向同一个内存空间,可以在函数内部修改外部传入的map中的值。

如果要实现深拷贝,新声明一个map然后使用for循环依次将元素赋值到新map中即可。

最后修改:2024 年 03 月 13 日
如果觉得我的文章对你有用,请随意赞赏