GO语言中的Map使用详解

这篇具有很好参考价值的文章主要介绍了GO语言中的Map使用详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Map简述

        Go语言中的map(映射、字典)是一种内置的数据结构,它是一个无序的key-value对的集合,比如以身份证号作为唯一键来标识一个人的信息。Go语言中并没有提供一个set类型,但是map中的key也是不相同的,可以用map实现类似set的功能。

GO语言中的Map使用详解

 map格式为:

 map[keyType]valueType

        在一个map里所有的键都是唯一的,而且必须是支持==和!=操作符的类型,切片、函数以及包含切片的结构类型这些类型由于具有引用语义,不能作为映射的键,使用这些类型会造成编译错误:

 dict := map[ []string ]int{} //err, invalid map key type []string

        map值可以是任意类型,没有限制。map里所有键的数据类型必须是相同的,值也必须如此,但键和值的数据类型可以不相同。

注意:map无序的,我们无法决定它的返回顺序,所以,每次打印结果的顺利有可能不同。

创建及初始化Map

创建Map

 fmt.Println(m1 == nil) 	//true
    //m1[1] = "Luffy" 		//nil的map不能使用err, panic: assignment to entry in nil map
    
    m2 := map[int]string{}	//m2, m3的创建方法是等价的
    m3 := make(map[int]string)
    fmt.Println(m2, m3) 		//map[] map[]

    m4 := make(map[int]string, 10) 	//第2个参数指定容量
    fmt.Println(m4)                	//map[]

        创建m4的方法指定了map的初始创建容量。 与slice类似,后期在使用过程中,map可以自动扩容。只不过map更方便一些,不用借助类似append的函数,直接赋值即可。如,m1[17] = "Nami"。赋值过程中,key如果与已有map中key重复,会将原有map中key对应的value覆盖。

        但是!对于map而言,可以使用len()函数,但不能使用cap()函数

初始化Map

        也可以直接指定初值,要保证key不重复。

    //1、定义同时初始化
    var m1 map[int]string = map[int]string{1: "Luffy", 2: "Sanji"}
    fmt.Println(m1) //map[1:Luffy 2:Sanji]

    //2、自动推导类型 :=
    m2 := map[int]string{1: "Luffy", 2: "Sanji"}
    fmt.Println(m2)

常用操作

赋值

    m1 := map[int]string{1: "Luffy", 2: "Sanji"}
    m1[1] = "Nami"   //修改
    m1[3] = "Zoro"  //追加, go底层会自动为map分配空间
    fmt.Println(m1) //map[1:Nami 2:Sanji 3:Zoro]

    m2 := make(map[int]string, 10) 	//创建map
    m2[0] = "aaa"
    m2[1] = "bbb"
    fmt.Println(m2)           		//map[0:aaa 1:bbb]
    fmt.Println(m2[0], m2[1]) 		//aaa bbb

遍历

        Map的迭代顺序是不确定的,并且不同的哈希函数实现可能导致不同的遍历顺序。在实践中,遍历的顺序是随机的,每一次遍历的顺序都不相同。这是故意的,每次都使用随机的遍历顺序可以强制要求程序不会依赖具体的哈希函数实现。

     m1 := map[int]string{1: "Luffy", 2: "Sanji"}
    //遍历1,第一个返回值是key,第二个返回值是value
    for k, v := range m1 {
        fmt.Printf("%d ----> %s\n", k, v)
        //1 ----> Luffy
        //2 ----> yoyo
    }

    //遍历2,第一个返回值是key,第二个返回值是value(可省略)
    for k := range m1 {
        fmt.Printf("%d ----> %s\n", k, m1[k])
        //1 ----> Luffy
        //2 ----> Sanji
    }

        有时候可能需要知道对应的元素是否真的是在map之中。可以使用下标语法判断某个key是否存在。map的下标语法将产生两个值,其中第二个是一个布尔值,用于报告元素是否真的存在。

        如果key存在,第一个返回值返回value的值。第二个返回值为 true。

    value, ok := m1[1]
    fmt.Println("value = ", value, ", ok = ", ok) //value =  mike , ok =  true

        如果key不存在,第一个返回值为空,第二个返回值为false。

value2, has := m1[3]
fmt.Println("value2 = ", value2, ", has = ", has) //value2 =   , has =  false

删除

        使用delete()函数,指定key值可以方便的删除map中的k-v映射。

    m1 := map[int]string{1: "Luffy", 2: "Sanji", 3: "Zoro"}
    
    for k, v := range m1 {	//遍历,第一个返回值是key,第二个返回值是value
        fmt.Printf("%d ----> %s\n", k, v)
    }
    //1 ----> Sanji
    //2 ----> Sanji
    //3 ----> Zoro
    delete(m1, 2) 		//删除key值为2的map

    for k, v := range m1 {
        fmt.Printf("%d ----> %s\n", k, v)
    }
    //1 ----> Luffy
    //3 ----> Zoro

        delete()操作是安全的,即使元素不在map中也没有关系;如果查找删除失败将返回value类型对应的零值。如:

    delete(m1, 5) 		//删除key值为5的map

    for k, v := range m1 {
        fmt.Printf("%d ----> %s\n", k, v)
    }
    //1 ----> Luffy
    //3 ----> Zoro

    Map输出结果依然是原来的样子,且不会有任何错误提示。

Map做函数参数

        与slice 相似,在函数间传递映射并不会制造出该映射的一个副本,不是值传递,而是引用传递

func DeleteMap(m map[int]string, key int) {
    delete(m, key) //删除key值为2的map
    for k, v := range m {
        fmt.Printf("len(m)=%d, %d ----> %s\n", len(m), k, v)
}
    //len(m)=2, 1 ----> Luffy
    //len(m)=2, 3 ----> Zoro
}

func main() {
    m := map[int]string{1: "Luffy", 2: "Sanji", 3: "Zoro"}
    DeleteMap(m, 2) 	//删除key值为2的map

    for k, v := range m {
        fmt.Printf("len(m)=%d, %d ----> %s\n", len(m), k, v)
}
    //len(m)=2, 1 ----> Luffy
    //len(m)=2, 3 ----> Zoro
}

Map做函数返回值

        返回的依然是引用

func test() map[int]string {
	// m1 := map[int]string{1: "Luffy", 2: "Sanji", 3: "Zoro"}
   m1 := make(map[int]string, 1)     // 创建一个初创容量为1的map
   m1[1] = "Luffy"
   m1[2] = "Sanji"                   // 自动扩容
   m1[67] = "Zoro"
   m1[2] = "Nami"                	// 覆盖 key值为2 的map
   fmt.Println("m1 = ", m1)
   return m1
}

func main() {
   m2 := test()                  	// 返回值 —— 传引用
   fmt.Println("m2 = ", m2)
}

输出:文章来源地址https://www.toymoban.com/news/detail-401087.html

m1 =  map[1:Luffy 2:Nami 67:Zoro]
m2 =  map[2:Nami 67:Zoro 1:Luffy]

到了这里,关于GO语言中的Map使用详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 100天精通Golang(基础入门篇)——第12天:深入解析Go语言中的集合(Map)及常用函数应用

    🌷 博主 libin9iOak带您 Go to Golang Language.✨ 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批

    2024年02月12日
    浏览(50)
  • 【GO语言依赖】Go语言依赖管理简述

    在运行环境中,遭遇报错,显示找不到函数 经过研究后发现需要进行依赖管理,进行如下操作后解决: 最早的时候,Go所依赖的所有的第三方库都放在GOPATH这个目录下面。这就导致了同一个库只能保存一个版本的代码。如果不同的项目依赖同一个第三方的库的不同版本,就需

    2024年01月16日
    浏览(46)
  • Go语言中的结构体详解

    Golang 中没有“类”的概念,Golang 中的结构体和其他语言中的类有点相似。和其他面向对 象语言中的类相比,Golang 中的结构体具有更高的扩展性和灵活性。 Golang 中的基础数据类型可以表示一些事物的基本属性,但是当我们想表达一个事物的全 部或部分属性时,这时候再用单

    2024年02月15日
    浏览(40)
  • Go 语言中的接口类型转换详解

    Go 语言是一门静态类型的语言,其中类型转换是一项基本的操作。在 Go 中,接口类型转换是一种特殊的类型转换,它涉及到将一个接口类型的值转换为其他具体类型的值。这个过程涉及到类型断言(Type Assertion)和类型判断(Type Switching)。本篇博客将深入探讨 Go 语言中接口

    2024年01月21日
    浏览(54)
  • 【Go】Go 语言教程--Go 语言Map(集合)(十六)

    往期回顾: Go 语言教程–介绍(一) Go 语言教程–语言结构(二) Go 语言教程–语言结构(三) Go 语言教程–数据类型(四) Go 语言教程–语言变量(五) Go 语言教程–GO语言常量(六) Go 语言教程–GO语言运算符(七) Go 语言教程–GO条件和循环语句(八) Go 语言教程

    2024年02月16日
    浏览(46)
  • Go语言程序设计(六)字典(映射)

            在Go语言中,Map是一种特殊的数据结构,它由一对无序的数据项组成,被称为键值对(Key-value Pair)。其中的一项是键(Key),另外一项是值(Value), Map通过把键映射到值来进行访问,这种方式可以加快数据查找的速度。所以,Map通常也被称作字典(Dictionary)或哈希表(Hash table) ,本

    2024年02月12日
    浏览(48)
  • go语言(八)---- map

    map的声明方式有以下三种。 map的使用方式 map的增删改查 map的传参

    2024年01月20日
    浏览(39)
  • Go 语言Map(集合)

    Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。 Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的。 定义 Map 可以

    2024年02月05日
    浏览(38)
  • 【Go 基础篇】Go语言结构体之间的转换与映射

    在Go语言中,结构体是一种强大的数据类型,用于定义和组织不同类型的数据字段。当我们处理复杂的数据逻辑时,常常需要在不同的结构体之间进行转换和映射,以便实现数据的转移和处理。本文将深入探讨Go语言中结构体之间的转换和映射技巧,包括类型转换、自定义转换

    2024年02月10日
    浏览(40)
  • 【Go语言快速上手(三)】数组, 切片与映射

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:Go语言专栏⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多Go语言知识   🔝🔝 在了解过GO的控制语句和函数后,按照学习语言的逻辑也理应进入到容器的学习,GO语言的容易比较特殊,它不像C++一样有专门的STL库

    2024年04月29日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包