Go语言入门07—Map

智数追光
• 阅读 318

1 Map

map是一种键值对形式的数据结构,一个键对应一个值,可以通过键快速检索出其对应的value值,在map中key的值是唯一的,value的值不唯一,并且map中保存的数据是无序的。

2 Map声明

声明Map可以使用map关键字进行声明,同时也可以通过make函数进行声明,仅仅通过map关键字声明的map为nil map,没有初始化的情况无法使用,如果直接往map里面赋值会发生panic,使用make函数声明后map才会在分配内存空间,且可以正常使用。

语法:

// 声明变量,默认 map 是 nil
var map名 map[键类型]值类型

// 使用 make 函数
map名 := make(map[键类型]值类型)

基本使用代码示例:

package main

import "fmt"

func main() {
  // 当前声明的m为nil map,无法直接使用
  var m map[string]int
  // 使用make初始化之后可正常使用
  m = make(map[string]int)
  // 朝m里面放一个键为one,值为1的键值对数据
  m["one"] = 1
  m["two"] = 2
  // 取出键为one对应的值
  fmt.Println(m["one"])
  fmt.Println(m["two"])
}

运行结果:

Go语言入门07—Map

map中的键是唯一的, 如果在map中已经存放了一个key对应的value,再次存放一样的key进去就会覆盖之前的value。

在使用map关键字声明一个map时,由于是nil map,所以直接使用会报panic,但是可以在声明时直接初始化赋值,这样使用时就不会导致panic,申明初始化方式如下:

m := map[string]int{"one" : 1, "two" : 2, "three" : 3}

3 循环遍历

map可以使用for range循环进行遍历,遍历是会得到map中的key集合,然后使用key即可获取到map的value。

代码示例:

package main

import "fmt"

func main() {
  m := map[string]int{"one" : 1, "two" : 2}
  for key := range m {
    fmt.Printf("键%s对应的值为%d \n", key, m[key])
  }
}

运行结果:

Go语言入门07—Map

4 查看元素是否存在

使用map名加中括号的方式获取一个key对应的value,如果当key不存在时,获取到的就是map声明时对应类型的默认值,例如var m map[string]int,如果这时候获取一个不存在的key,返回的就是0,那么我们要如何才能知道返回的0是代表不存在这个key还是这个key对应的value本来就是0呢?

其实对于这个问题的解决方法很简单,在map通过中括号取值时,不只是返回一个值,还会返回一个bool类型,这个类型就代表了当前需要查找的key是否存在。

代码示例:

package main

import "fmt"

func main() {
  m := map[string]int{"zero" : 0, "one" : 1, "two" : 2}
  value, ok := m["zero"]
  if ok {
    fmt.Println("zero存在,value:", value)
  } else {
    fmt.Println("zero不存在,value:", value)
  }
  value, ok = m["three"]
  if ok {
    fmt.Println("three存在,value:", value)
  } else {
    fmt.Println("three不存在,value:", value)
  }
}

在上述代码中,m中有key为zero对应的值为0,所以直接通过m["zero"]取值,获取到的ok为true,且value=0,但是在使用m["three"]取值时,由于m中没有three这个key,所以获取到的ok为false,value同样也是0。

运行结果:

Go语言入门07—Map

5 删除元素

在使用map时还可以通过delete函数删除map中的元素,使用delete函数时需要指定两个参数,第一个参数为需要操作的map,第二个参数为需要删除的key。

代码示例:

package main

import "fmt"

func main() {
  m := map[string]int{"zero" : 0, "one" : 1, "two" : 2}
    // 删除m中key为two的元素
  delete(m, "two")
  value, ok := m["two"]
  if ok {
    fmt.Println(value)
  } else {
    fmt.Println("two不存在")
  }
}

由于删除了two这个key,所以再次通过这个key取值的时候就会提示two不存在

运行结果:
Go语言入门07—Map

本文参与了SegmentFault 思否写作挑战赛活动,欢迎正在阅读的你也加入。
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java8新特性
Stream将List转换为Map,使用Collectors.toMap方法进行转换背景:User类,类中分别有id,name,age三个属性。List集合,userList,存储User对象1、指定keyvalue,value是对象中的某个属性值。 Map<Integer,StringuserMap1userList.str
Wesley13 Wesley13
3年前
java中的HashMap和TreeMap
HashMap和TreeMap两者都是Map,java中的Map以键值对来存储数据,通过键key来索引值value。HashMap通过hashcode对其内容进行快速查找,其结果时无序的;TreeMap中的所有元素都默认进行了排序,所以当需要一个有序的结果时,使用TreeMap是比较方便的。具体的定义和遍历方法,可以看下面的例子:
Wesley13 Wesley13
3年前
java中map接口hashMap以及Enty之间的用法和关系
java中map接口hashMap以及Enty之间的转换首先说的是map接口:Map提供了一种映射关系,其中的元素是以键值对(keyvalue)的形式存储的,能够实现根据key快速查找value;建(key值)不可重复,value值可以重复,一个value值可以和很多key值形成对应关系,每个建最多只能映射到一个值。Ma
陈占占 陈占占
3年前
python 字典
字典(dict):以键值对的方式存在,以大括号为标志、在字典里面键是不能修改的,值可以修改语法格式:字典名{key1:value1,key2:value2,.......}note:是无序的类型,建必须唯一,值不必。索引是以键为下标,不能索引键对应的值,键不能为列表特点:1.键值之间必须用冒号(:)隔开2.项与项之间必须用逗号(,)隔开3.字典中的键必须
Stella981 Stella981
3年前
ECMA Script 6之 Map 与 Set
Map对象保存键值对。任何值(对象或者原始值)都可以作为一个键或一个值。!ECMAScript6之Map与SetECMAScript6之Map与Set(https://www.linuxprobe.com/wpcontent/uploads/2020/07/126.png)Map对象Map对象保
Stella981 Stella981
3年前
C++ multimap初步使用
multimap与map的区别就在于,multimap可以一个键值对应多个值,而map只能一个键值对应一个值include <iostreaminclude <mapint main(){std::multimap<int,int x;x.insert(std::pa
Stella981 Stella981
3年前
Key
KeyValue是用一个不可重复的key集合对应可重复的value集合。(典型的例子是字典:通过页码的key值找字的value值)。例子:key1—value1;key2—value2;key3—value3.SortedMap:如果一个Map可以根据key值排序,则称其为SortedMap。(如字典)!!注意数组和集合的区别:数组
Stella981 Stella981
3年前
HashMap Hashtable 的区别
Hashtable 和 HashMap作为 Map 的基本特性两者都实现了Map接口,基本特性相同\          对同一个Key,只会有一个对应的value值存在\          如何算是同一个Key?首先,两个key对象的hash值相同,其次,key对象的equals方法返回真内部数据结构Hashtab
Wesley13 Wesley13
3年前
Java集合之Map接口
Map使用键值对来存储数据,将键映射到值对象,一个映射不能包含重复的键,每一个键最多只能映射到一个值。Map接口的具体实现类:HashMap,Hashtable,TreeMap,LinkedHashMap  1)HashMap  基于哈希表(哈希表学习地址)的Map接口实现。允许使用null值和null键,不保证映射的顺序,特别是不保证顺序恒
Wesley13 Wesley13
3年前
Java中的Map集合
Map接口简介Map接口是一种双列集合,它的每个元素都包含一个键对象Key和值对象Value,键和值对象之间存在一种对应关系,称为映射。从Map集合中访问元素时,只要指定了Key,就能找到对应的Value,Map中的键必须是唯一的,不能重复,如果存储了相同的键,后存储的值会覆盖原有的值,简而言之就是键相同,值覆盖。Map常用
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(