本系列前面的文章:

1. 声明

map是一种映射,可以将键(key)映射到值(value),格式为:map[keyType]valueType

声明一个map并初始化它,使用key:value进行初始化:

var scores = map[string]int {"数学":100, "语文":90, "Go":100}

如果不想直接初始化,可以先声明再使用,注意这样需要使用make函数初始化后才能使用:

var scores map[string]int
scores = make(map[string]int)

为什么这样声明需要使用make函数?

map的零值是nil map,没有键,也不能添加键。

var m map[string]int //声明一个m map,它现在默认是nil
fmt.Println(m) //map[]
m["A"] = 1 //报错:assignment to entry in nil map

所以为了不让该map不是nil,需要使用make初始化:

var m map[string]int //nil
m = make(map[string]int) //初始化
m["A"] = 1 //添加元素
fmt.Println(m) //map[A:1]

当然,方便的短变量声明方式也能用:

m := map[string]int {"A":1, "B":2}
或者
m := make(map[string]int)
m["A"] = 1
m["B"] = 2

2. 增删改查

(增)增加键值对:

scores["数学"] = 100 //向scores这个map添加了键为“数学”,值为100的数据
scores["语文"] = 90

(删)删除键值对:

delete(scores, "语文")

(改)修改键值对和增加键值对的语法相同(当key不存在时为增加,当key存在时为修改):

scores["语文"] = 10

(查)使用key可以查找到对应的value,会返回两个值,第一个是key对应的value,第二个是布尔值(如果key存在,是true;否则是false)。如果查找的key不存在,则会返回value类型的“零值”:

score, exist := scores["数学"] //使用两个返回值
fmt.Println(score, exist) //100 true score1 := scores["语文"] //使用一个返回值
fmt.Println(score1) //90 score2, exist2 := scores["Java"] //查找不存在的key
fmt.Println(score2, exist2) //0 false

3. 其他用法

slice一样,map也是引用类型,则意味着,如果有几个map同时指向一个底层map,其中一个map改变某个键值对,那么其他的也会做出同样的改变(因为底层map变了)。

package main

import "fmt"

func main() {
map0 := make(map[string]string) //底层map0
map0["name"] = "XingXiaoguan" //增加一个键值对 //map1 map2 引用map0
map1 := map0
map2 := map0 fmt.Println(map0["name"], map1["name"], map2["name"]) //都是XingXiaoguan map1["name"] = "XingRenGuanXue" //改变map1的name对应的值
fmt.Println(map0["name"], map1["name"], map2["name"]) //全部变为XingRenGuanXue
}

使用len函数可以获取mapkey的数量:

keyNum := len(scores) //获取scores这个map中key的数量

map是无序的,所以其返回的元素顺序可能每次都不同。

可以使用range关键字遍历map,这里range返回的第一个值是key,第二个值是value

//遍历scores map
for key, value := range scores {
fmt.Println(key, value)
} 输出:
数学 100
语文 90

如有错误,还请指正。

4. 关于我

点击这里认识我 。 (^o^)/

Go语言入门系列(四)之map的使用的更多相关文章

  1. Go语言入门系列(五)之指针和结构体的使用

    Go语言入门系列前面的文章: Go语言入门系列(二)之基础语法总结 Go语言入门系列(三)之数组和切片 Go语言入门系列(四)之map的使用 1. 指针 如果你使用过C或C++,那你肯定对指针这个概念 ...

  2. Go语言入门系列(六)之再探函数

    Go语言入门系列前面的文章: Go语言入门系列(三)之数组和切片 Go语言入门系列(四)之map的使用 Go语言入门系列(五)之指针和结构体的使用 在Go语言入门系列(二)之基础语法总结这篇文章中已经 ...

  3. C语言高速入门系列(四)

    C语言高速入门系列(四) C语言数组 ---------转载请注明出处:coder-pig 贴心小提示:假设图看不清晰可右键另存为,应该就非常清晰了; 注意上面的代码都要自己过一遍哦! 本节引言: 经 ...

  4. 【Go语言入门系列】(七)如何使用Go的方法?

    [Go语言入门系列]前面的文章: [Go语言入门系列](四)之map的使用 [Go语言入门系列](五)之指针和结构体的使用 [Go语言入门系列](六)之再探函数 本文介绍Go语言的方法的使用. 1. ...

  5. 【Go语言入门系列】Go语言工作目录介绍及命令工具的使用

    [Go语言入门系列]前面的文章: [保姆级教程]手把手教你进行Go语言环境安装及相关VSCode配置 [Go语言入门系列](八)Go语言是不是面向对象语言? [Go语言入门系列](九)写这些就是为了搞 ...

  6. 【Go语言入门系列】(八)Go语言是不是面向对象语言?

    [Go语言入门系列]前面的文章: [Go语言入门系列](五)指针和结构体的使用 [Go语言入门系列](六)再探函数 [Go语言入门系列](七)如何使用Go的方法? 1. Go是面向对象的语言吗? 在[ ...

  7. 【Go语言入门系列】(九)写这些就是为了搞懂怎么用接口

    [Go语言入门系列]前面的文章: [Go语言入门系列](六)再探函数 [Go语言入门系列](七)如何使用Go的方法? [Go语言入门系列](八)Go语言是不是面向对象语言? 1. 引入例子 如果你使用 ...

  8. [转]C# 互操作性入门系列(四):在C# 中调用COM组件

    传送门 C#互操作系列文章: C# 互操作性入门系列(一):C#中互操作性介绍 C# 互操作性入门系列(二):使用平台调用调用Win32 函数 C# 互操作性入门系列(三):平台调用中的数据封送处理 ...

  9. spring cloud 入门系列四:使用Hystrix 实现断路器进行服务容错保护

    在微服务中,我们将系统拆分为很多个服务单元,各单元之间通过服务注册和订阅消费的方式进行相互依赖.但是如果有一些服务出现问题了会怎么样? 比如说有三个服务(ABC),A调用B,B调用C.由于网络延迟或C ...

随机推荐

  1. Python Ethical Hacking - TROJANS Analysis(4)

    Adding Icons to Generated Executables Prepare a proper icon file. https://www.iconfinder.com/ Conver ...

  2. 帮助你更好的理解Spring循环依赖

    网上关于Spring循环依赖的博客太多了,有很多都分析的很深入,写的很用心,甚至还画了时序图.流程图帮助读者理解,我看了后,感觉自己是懂了,但是闭上眼睛,总觉得还没有完全理解,总觉得还有一两个坎过不去 ...

  3. [jvm] -- 类加载器及双亲委派模板篇

    类加载器 JVM 中内置了三个重要的 ClassLoader BootstrapClassLoader(启动类加载器):最顶层的加载类,由C++实现,负责加载 %JAVA_HOME%/lib目录下的j ...

  4. #python自动化测试#代码执行时间测量模块timeit

    1. timeit模块timeit模块可以用来测试一小段python代码的执行速度 class timeit.Timer(stmt = 'pass',setup = 'pass',timer=< ...

  5. java 多线程的售票问题

    java 多线程的售票问题 对票的库存进行操作 public class Tickets implements Runnable{ private int ticket = 100; public v ...

  6. Asp.Net Core 中的“虚拟目录”

    写在前面 现在部署Asp.Net Core应用已经不再限制于Windows的IIS上,更多的是Docker容器.各种反向代理来部署.也有少部分用IIS部署的,IIS部署确实是又快又简单,图形化操作三下 ...

  7. vue中v-for

    在vue中我们只要操作数据,就可以渲染和更新数据,这背后的boss就是diff算法 vue和react的虚拟DOM的Diff算法大致相同,其核心是基于两个简单的假设: 1. 俩个相同组件产生类似DOM ...

  8. js的传递方式

    回头过来复习一下. 从一个变量向另一个变量复制的时候,复制过去以后,都是单独独立的变量,当你改变其中一个的时候,并不会影响另一个变量.他们只是value相同而已: var a = 1; var b= ...

  9. 萌新学渗透系列之Hack The Box_Devel

    我将我的walkthrough过程用视频解说的形式记载 视频地址https://www.bilibili.com/video/BV1Ck4y1B7DB 一是因为看我视频的后来者应该都是刚入门的新手,视 ...

  10. Django学习路26_转换字符串大小写 upper,lower

    在 urls 中注册 url(r'getstr',views.getstr) 在 views.py 中添加函数 def getstr(request): string = 'abc' string_2 ...