map是一种无序的基于 key-value 的数据结构,Go语言中的map是引用类型,所以跟切片一样需要初始化才能使用。

定义map

定义 map 的语法如下:

map[keyType]ValueType

// keyType 键的类型
// ValueType 键对应的值的类型

定义 map 而不初始化时,默认值等于 nil,此时不能直接赋值的,如:

func main() {
var a map[string]int // 定义了map
fmt.Println(a==nil) // true
a["age"] = // error 未初始化直接赋值,会报错
}

可以使用 make() 来给 map 分配内存,有了容量的 map 是可以操作的,格式如下:

make(map[keyType]valueType,[cap])

// 其中cap表示map的容量,该参数虽然不是必须的,但是我们应该在初始化map的时候就为其指定一个合适的容量。

map 基本使用

使用 make()定义map:

func main() {
myMap := make(map[string]int,)
fmt.Println(myMap) // map[]
fmt.Println(myMap==nil) // false
myMap["小明"] =
fmt.Println(myMap) // map[小明:100]
fmt.Println(myMap["小明"]) //
fmt.Printf("Type:%T",myMap) // Type:map[string]int
}

你也可以直接在定义时填充元素:

func main() {
userInfo:=map[string]string{
"username":"wj",
"address":"中国",
} fmt.Println(userInfo) // map[address:中国 username:wj]
fmt.Printf("%#v",userInfo) // map[string]string{"address":"中国", "username":"wj"} // 占位符 "%#v" 输出对应值的Go语法表示
}

判断某个键是否存在

Go语言中有个判断map中键是否存在的特殊写法,格式如下:

value,ok := map[key]

例子:

func main() {
userInfo:=map[string]string{
"username":"wj",
"address":"中国",
} v,ok := userInfo["username"]
if ok {
fmt.Printf("有username这个key,其值为:%v",v)
}else{
fmt.Println("没有username这个key")
}
}

遍历map

使用 for range 来遍历 map:

func main() {
ageMap:=make(map[string]int,)
ageMap["小明"] =
ageMap["小红"] =
ageMap["小军"] = for k,v:=range ageMap{
fmt.Println(k,v)
}
} // 小明 18
// 小红 15
// 小军 16

有时如果只想遍历key,我们可以这样写:

for k:_=range ageMap{
fmt.Println(k)
}

但在遍历map时,如果只想要遍历key,可以省略_,直接这样写:  

for k:=range ageMap{
fmt.Println(k)
}

需要注意的是,遍历map时的元素顺序与添加键值对的顺序无关。

使用 delete() 函数删除键值对

使用内建函数 delete() 删除map中的一组键值对,语法格式:

delete(map,key)

例子:

func main() {
ageMap:=make(map[string]int,)
ageMap["小明"] =
ageMap["小红"] =
ageMap["小军"] =
delete(ageMap,"小红") // 将 小红:15 删除
for v,k:=range ageMap{
fmt.Println(v,k)
}
} // 小明 18
// 小军 16

元素为map类型的切片

func main() {
var mapSlice = make([]map[string]string,) // 定义值类型为map的切片,容量为3
for i,v:=range mapSlice{
fmt.Println(i,v)
}
// mapSlice[0]["username"] = "wj" // error,直接操作切片的map元素会报错 mapSlice[] = make(map[string]string,) // 对切片中的 map元素 进行初始化
mapSlice[]["username"] = "wj"
mapSlice[]["address"] = "中国"
for i,v:=range mapSlice{
fmt.Println(i,v)
}
} // 0 map[]
// 1 map[]
// 2 map[]
// 0 map[address:中国 username:wj]
// 1 map[]
// 2 map[]

值为切片类型的map

func main() {
var sliceMap = make(map[string][]string,) // 定义值为切片类型的map
fmt.Println(sliceMap)
sliceMap["address"] = []string{"北京","上海"}
fmt.Println(sliceMap)
} // map[]
// map[address:[北京 上海]]

Go语言中的map(十一)的更多相关文章

  1. 【翻译】go语言中的map实战

    业余时间翻译,水平很差,如有瑕疵,纯属无能. 原文链接 http://blog.golang.org/go-maps-in-action go语言中的map实战 1. 简介 哈希表是计算机科学中最重要 ...

  2. Go语言中的map

    map是一个集合,可以使用类似处理数组和切片的方式迭代map中的元素.但map是无序的集合.无序的原因是map的实现使用了散列表. map的创建并初始化主要是两种方式: 1.内置的make函数 2.使 ...

  3. 详细解读go语言中的map

    Map map底层是由哈希表实现的 Go使用链地址法来解决键冲突. map本质上是一个指针,指向hmap 这里的buckets就是桶,bmap 每一个bucket最多可以放8个键值对,但是为了让内存排 ...

  4. Java 语言中 Enum 类型的使用介绍

    Enum 类型的介绍 枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中.而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常 ...

  5. [转]理解Go语言中的nil

    最近在油管上面看了一个视频:Understanding nil,挺有意思,这篇文章就对视频做一个归纳总结,代码示例都是来自于视频. nil是什么 相信写过Golang的程序员对下面一段代码是非常非常熟 ...

  6. [转]Go语言中的make和new

    前言 本文主要给大家介绍了Go语言中函数new与make的使用和区别,关于Go语言中new和make是内建的两个函数,主要用来创建分配类型内存.在我们定义生成变量的时候,可能会觉得有点迷惑,其实他们的 ...

  7. Go语言中new和make的区别

    Go语言中new跟make是内置函数,主要用来创建分配类型内存. new( ) new(T)创建一个没有任何数据的类型为T的实例,并返回该实例的指针: 源码解析 func new func new(T ...

  8. C语言中,头文件和源文件的关系(转)

    简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句, ...

  9. C 语言中 setjmp 和 longjmp

    在 C 语言中,我们不能使用 goto 语句来跳转到另一个函数中的某个 label 处:但提供了两个函数——setjmp 和 longjmp来完成这种类型的分支跳转.后面我们会看到这两个函数在处理异常 ...

随机推荐

  1. c++顺序表(数组)查找最大最小值

    #include <iostream> #define MAXSIZE 100 using namespace std; void find(int a[],int m) {int min ...

  2. 一、MySQL一些简述

    概述 数据库(database) : 保存有组织的数据的容器(通常是一个文件或一组文件). 主键(primary key): 唯一标识表中每行的这个列(或这组列)称为主键.主键用表示一个特定的行.没有 ...

  3. 成员函数定义后面加 const 的意义

    我们定义的类的成员函数中,常常有一些成员函数不改变类的数据成员,也就是说,这些函数是"只读"函数,而有一些函数要修改类数据成员的值.如果把不改变数据成员的函数都加上const关键字 ...

  4. 20175215 2018-2019-2 第九周java课程学习总结

    第十一章 JDBC与MySQL数据库 11.1 MySQL数据库管理系统 下载安装过程略 使用的是MySQL 5.6而非5.7 11.2 启动MySQL数据库服务器 启动和root用户过程略 11.3 ...

  5. python:BeautifulSoup学习

    上一篇说到用BeautifulSoup解析源代码,下面我们就来实战一下: from bs4 import BeautifulSoup html = urllib.request.urlopen('ht ...

  6. mongodb 操作笔记

    切换库:use 库名 显示所有的数据库:show dbs 创建集合:db.createCollection("collection_name",{capped:true,size: ...

  7. 1.1 从零搭建Go语言开发环境

    一.下载 下载地址: Go官网下载地址:https://golang.org/dl/ Go官方镜像站(推荐):https://golang.google.cn/dl/ 版本的选择 Windows平台和 ...

  8. 【makefile】make程序的命令行选项和参数

    Make命令参数的典型序列如下所示: make [-f makefile文件名][选项][宏定义][目标] 这里用[]括起来的表示是可选的.命令行选项由破折号“–”指明,后面跟选项,如: make – ...

  9. EvenBus源码分析

    概述 一般使用EventBus的组件类,类似下面这种方式: public class SampleComponent extends Fragment { @Override public void ...

  10. spring 过滤器- 过滤登陆请求路径(过滤静态资源跳转到登陆页面)

    public class LoginedFilter implements Filter { /** * 排除的地址 */ private Map<String, Boolean> ign ...