Go语言中map集合的具体使用

 更新时间:2023年02月17日 11:19:06   作者:量化Mike  
本文主要介绍了Go语言中map集合的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Go 语言提供了内置类型 map集合,它将一个值与一个键关联起来,可以使用相应的键检索值。

  • map是一种集合,可以像遍历数组或切片那样去遍历它。因为map是由Hash表实现的,所以对map的读取顺序不固定。
  • map是无序的,每次打印出来的map都会不一样,它不能通过index获取,而必须通过key获取。
  • map的长度是不固定的,和切片一样可以扩展。

内置的len()函数同样适用于map,返回map拥有的键值对的数量。但是map不能通过cap()函数计算容量(或者说cap()函数的参数不可以是map)。

同一个map中key必须保证唯一。key的数据类型必须是可参与比较运算的类型,也就是支持==或!=操作的类型,如布尔型、整型、浮点型、字符串、数组。切片、函数等引用类型则不能作为key的数据类型。

map的value可以是任何数据类型。map和切片一样,也是一种引用类型。

1-1 定义

map声明

  • 使用make()函数:变量名 := make(map[key类型]value类型)
    • 该声明方式,如果不初始化map,map也不等于nil。
  • 使用var关键字定义map:var 变量名 map[key类型] value类型
    • 使用var关键字声明map,未初始化的map的默认值是nil。
    • nil map不能存放键值对。
    • 如果要使用map存储键值对,必须在声明时初始化,或者使用make()函数分配到内存空间。

1-2 map遍历

map的初始化赋值和遍历

package main

import "fmt"

func main() {
    //1、声明时同时初始化
    var country = map[string]string{
        "China":  "Beijing",
        "Japan":  "Tokyo",
        "India":  "New Delhi",
        "France": "Paris",
        "Italy":  "Rome",
    }
    fmt.Println(country)

    // 短变量声明初始化方式
    rating := map[string]float64{"c": 5, "Go": 4.5, "Python": 4.5, "C++": 3}
    fmt.Println(rating)

    //2、创建map后再赋值
    countryMap := make(map[string]string)
    countryMap["China"] = "Beijing"
    countryMap["Japan"] = "Tokyo"
    countryMap["India"] = "New Delhi"
    countryMap["France"] = "Paris"
    countryMap["Italy"] = "Rome"

    //3、遍历map(无序)
    //(1)、key 、value都遍历
    for k, v := range countryMap {
        fmt.Println("国家", k, "首都", v)
    }
    fmt.Println("-----------")

    //(2)、只展示value
    for _, v := range countryMap {
        fmt.Println("国家", "首都", v)
    }
    fmt.Println("-----------")

    //(3)、只展示key
    for k := range countryMap {
        fmt.Println("国家", k, "首都", countryMap[k])
    }
}

查看元素在集合中是否存在

  • 可以通过key获取map中对应的value值。语法为:map[key]。
  • 当key不存在时,会得到该value值类型的默认值,比如string类型得到空字符串,int类型得到0,程序不会报错。
  • 可以通过value, ok := map[key]获知key/value是否存在。ok是bool型,如果ok是true,则该键值对存在,否则不存在。
package main

import "fmt"

func main() {
    countryMap := make(map[string]string)
    countryMap["China"] = "Beijing"
    countryMap["Japan"] = "Tokyo"
    countryMap["India"] = "New Delhi"
    countryMap["France"] = "Paris"
    countryMap["Italy"] = "Rome"

    //查看元素是否在map中存在
    value, ok := countryMap["England"]
    fmt.Printf("%q \n", value)
    fmt.Printf("%T , %v \n", ok, ok)
    if ok {
        fmt.Println("首都:", value)
    } else {
        fmt.Println("首都信息未检索到!")
    }

    //或者
    if value, ok := countryMap["USA"]; ok {
        fmt.Println("首都:", value)
    } else {
        fmt.Println("首都信息未检索到!")
    }
}

1-3 map集合删除

delete(map, key) 函数用于删除集合的某个元素,参数为map和其对应的key。删除函数不返回任何值。

Go语言没有为map提供清空所有元素的函数,清空map的唯一办法是重新make一个新的map。不用担心垃圾回收的效率,Go语言的垃圾回收比写一个清空函数更高效。

package main

import "fmt"

func main() {
    //1、声明并初始化一个map
    map1 := map[string]string{
        "element":    "div",
        "width":      "100px",
        "height":     "200px",
        "border":     "solid",
        "background": "none",
    }

    //2、根据key删除map中的某个元素
    fmt.Println("删除前:", map1)
    if _, ok := map1["background"]; ok {
        delete(map1, "background")
    }
    fmt.Println("删除后:", map1)

    //3、清空map
    //map1 = map[string]string{}
    map1 = make(map[string]string)
    fmt.Println("清空后:", map1)
}

1-4 map是引用类型

map与切片相似,都是引用类型。将一个map赋值给一个新的变量时,它们指向同一块内存(底层数据结构)。修改两个变量的内容都能够引起它们所指向的数据发生变化。

package main

import "fmt"

func main() {
    personSalary := map[string]int{
        "Steven": 18000,
        "Daniel": 5000,
        "Josh":   20000,
    }
    fmt.Println("原始薪资:", personSalary)
    newPersonSalary := personSalary
    newPersonSalary["Daniel"] = 8000
    fmt.Println("修改后newPersonSalary:", newPersonSalary)
    fmt.Println("personSalary受影响情况:", personSalary)
}

虽然就底层而言,所有的数据都是由比特组成,但计算机一般操作的是固定大小的数,如整型、浮点型、布尔型、字符串、字符(byte、rune)等。进一步将这些数组织在一起,就可表达更多的对象。

Go语言提供了丰富的数据组织形式,这依赖于Go语言内置的数据类型。这些内置的数据类型,如函数与指针、数组、切片、map等,兼顾了硬件的特性和表达复杂数据结构的便捷性。

到此这篇关于Go语言中map集合的具体使用的文章就介绍到这了,更多相关Go语言中map集合内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一文带你了解Go中跟踪函数调用链的实现

    一文带你了解Go中跟踪函数调用链的实现

    这篇文章主要为大家详细介绍了go如何实现一个自动注入跟踪代码,并输出有层次感的函数调用链跟踪命令行工具,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-11-11
  • GoLang unsafe包详细讲解

    GoLang unsafe包详细讲解

    从golang的定义来看,unsafe 是类型安全的操作。顾名思义,它应该非常谨慎地使用; unsafe可能很危险,但也可能非常有用。例如,当使用系统调用和Go结构必须具有与C结构相同的内存布局时,您可能别无选择,只能使用unsafe
    2022-10-10
  • 轻松构建Go应用的Dockerfile

    轻松构建Go应用的Dockerfile

    本文介绍了如何制作一个用于构建和运行Go应用程序的Docker镜像的Dockerfile的相关资料,需要的朋友可以参考下
    2023-10-10
  • Go正则表达式匹配字符串,替换字符串方式

    Go正则表达式匹配字符串,替换字符串方式

    介绍了Go语言中使用正则表达式进行字符串匹配和替换的方法,包括匹配单个子字符串和所有子字符串,个人经验分享,旨在为读者提供实用的编程技巧,并鼓励大家支持脚本之家
    2025-02-02
  • Go语言并发之原子操作详解

    Go语言并发之原子操作详解

    代码中的加锁操作因为涉及内核态的上下文切换会比较耗时、代价比较高。针对基本数据类型我们还可以使用原子操作来保证并发安全,本文就来和大家详细聊聊,需要的可以参考下
    2022-12-12
  • Golang的os标准库中常用函数的整理介绍

    Golang的os标准库中常用函数的整理介绍

    这篇文章主要介绍了Go语言的os标准库中常用函数,主要用来实现与操作系统的交互功能,需要的朋友可以参考下
    2015-10-10
  • Go 请求兔子识别接口实现流程示例详解

    Go 请求兔子识别接口实现流程示例详解

    这篇文章主要为大家介绍了Go 请求兔子识别接口实现流程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Golang实现自定义时间结构体并支持Json&Gorm

    Golang实现自定义时间结构体并支持Json&Gorm

    因为时区等问题,很多项目需要自定义时区和时间格式,所以这篇文章主要为大家介绍了Golang如何实现自定义时间结构体并支持Json&Gorm,希望对大家有所帮助
    2024-03-03
  • Go语言fmt库详解与应用实例(格式化输入输出功能)

    Go语言fmt库详解与应用实例(格式化输入输出功能)

    fmt库是Go语言中一个强大而灵活的库,提供了丰富的格式化输入输出功能,通过本文的介绍和实例演示,相信你对fmt库的使用有了更深的理解,感兴趣的朋友一起看看吧
    2023-10-10
  • 浅谈golang slice 切片原理

    浅谈golang slice 切片原理

    这篇文章主要介绍了浅谈golang slice 切片原理,详细的介绍了golang slice 切片的概念和原理,具有一定的参考价值,有兴趣的可以了解一下
    2017-11-11

最新评论