GoLang基础数据类型---字典
Map 是 Go 中的内置类型,它将键与值绑定到一起。可以通过键获取相应的值。
如何创建 map?
可以通过将键和值的类型传递给内置函数 make
来创建一个 map。语法为:make(map[KeyType]ValueType)
。(译者注:map 的类型表示为 map[KeyType]ValueType
)例如:
personSalary := make(map[string]int)
上面的代码创建了一个名为 personSalary
的 map。其中键的类型为 string,值的类型为 int。
map 的 0 值为 nil。试图给一个 nil map 添加元素给会导致运行时错误。因此 map 必须通过 make
来初始化(也可以使用速记声明来创建 map)
package main import (
"fmt"
) func main() {
var personSalary map[string]int
if personSalary == nil {
fmt.Println("map is nil. Going to make one.")
personSalary = make(map[string]int)
}
}
上面的程序中,personSalary
为 nil,因此使用 make
初始化它。程序的输出为:map is nil. Going to make one.
向 map 中插入元素
插入元素给 map 的语法与数组相似。下面的代码插入一些新的元素给 map personSalary
。
package main import (
"fmt"
) func main() {
personSalary := make(map[string]int)
personSalary["steve"] = 12000
personSalary["jamie"] = 15000
personSalary["mike"] = 9000
fmt.Println("personSalary map contents:", personSalary)
}
上面的程序输出:personSalary map contents: map[steve:12000 jamie:15000 mike:9000]
。
也可以在声明时初始化一个数组:
package main import (
"fmt"
) func main() {
personSalary := map[string]int {
"steve": 12000,
"jamie": 15000,
}
personSalary["mike"] = 9000
fmt.Println("personSalary map contents:", personSalary)
}
上面的程序在声明 personSalary
的同时向其中
插入了两个元素。接着插入了一个以 "mike"
为键的元素。程序的输出为:
personSalary map contents: map[steve:12000 jamie:15000 mike:9000]
string
并不是可以作为键的唯一类型,其他所有可以比较的类型,比如,布尔类型,整型,浮点型,复数类型都可以作为键。如果你想了解更多关于可比较类型的话,请参阅:http://golang.org/ref/spec#Comparison_operators
访问 map 中的元素
现在我们已经添加了一些元素给 map,现在让我们学习如何从 map 中提取它们。根据键获取值的语法为:map[key]
,例如:
package main import (
"fmt"
) func main() {
personSalary := map[string]int{
"steve": 12000,
"jamie": 15000,
}
personSalary["mike"] = 9000
employee := "jamie"
fmt.Println("Salary of", employee, "is", personSalary[employee])
}
上面的程序非常简单。员工 jamie
的工资被取出并打印。程序的输出为:Salary of jamie is 15000
。
如果一个键不存在会发生什么?map 会返回值类型的 0 值。比如如果访问了 personSalary
中的不存在的键,那么将返回 int 的 0 值,也就是 0。
package main import (
"fmt"
) func main() {
personSalary := map[string]int{
"steve": 12000,
"jamie": 15000,
}
personSalary["mike"] = 9000
employee := "jamie"
fmt.Println("Salary of", employee, "is", personSalary[employee])
fmt.Println("Salary of joe is", personSalary["joe"])
}
上面的程序输出为:
Salary of jamie is 15000
Salary of joe is 0
上面的程序返回 joe
的工资为 0。我们没有得到任何运行时错误说明键 joe
在 personSalary
中不存在。
我们如何检测一个键是否存在于一个 map 中呢?可以使用下面的语法:
value, ok := map[key]
上面的语法可以检测一个特定的键是否存在于 map 中。如果 ok
是 true,则键存在,value 被赋值为对应的值。如果 ok
为 false,则表示键不存在。
package main import (
"fmt"
) func main() {
personSalary := make(map[string]int)
personSalary["steve"] = 12000
personSalary["jamie"] = 15000
personSalary["mike"] = 9000
fmt.Println("personSalary map contents:", personSalary) value, ok := personSalary["Tom"]
if ok == true {
fmt.Println(value)
} else {
fmt.Println("Tom is not exist")
} }
在上面的程序中,第 15 行,ok
应该为 false 因为 Tom不存在。因此程序的输出为:
Tom is not exist
range for 可用于遍历 map 中所有的元素(译者注:这里 range 操作符会返回 map 的键和值)。
package main import (
"fmt"
) func main() {
personSalary := map[string]int{
"steve": 12000,
"jamie": 15000,
}
personSalary["mike"] = 9000
fmt.Println("All items of a map")
for key, value := range personSalary {
fmt.Printf("personSalary[%s] = %d\n", key, value)
} }
上面的程序输出如下:
All items of a map
personSalary[mike] = 9000
personSalary[steve] = 12000
personSalary[jamie] = 15000
值得注意的是,因为 map 是无序的,因此对于程序的每次执行,不能保证使用 range for 遍历 map 的顺序总是一致的。
删除元素
delete(map, key)
用于删除 map 中的 key。delete
函数没有返回值。
package main import (
"fmt"
) func main() {
personSalary := map[string]int{
"steve": 12000,
"jamie": 15000,
}
personSalary["mike"] = 9000
fmt.Println("map before deletion", personSalary)
delete(personSalary, "steve")
fmt.Println("map after deletion", personSalary) }
上面的程序删除以 steve
为键的元素。程序输出为:
map before deletion map[steve:12000 jamie:15000 mike:9000]
map after deletion map[mike:9000 jamie:15000]
map 的大小
用内置函数 len 获取 map 的大小:
package main import (
"fmt"
) func main() {
personSalary := map[string]int{
"steve": 12000,
"jamie": 15000,
}
personSalary["mike"] = 9000
fmt.Println("length is", len(personSalary)) }
上面程序中,len(personSalary)
获取 personSalary
的大小。上面的程序输出:length is 3
。
map 是引用类型
与切片一样,map 是引用类型。当一个 map 赋值给一个新的变量,它们都指向同一个内部数据结构。因此改变其中一个也会反映到另一个:
package main import (
"fmt"
) func main() {
personSalary := map[string]int{
"steve": 12000,
"jamie": 15000,
}
personSalary["mike"] = 9000
fmt.Println("Original person salary", personSalary)
newPersonSalary := personSalary
newPersonSalary["mike"] = 18000
fmt.Println("Person salary changed", personSalary)
}
上面的程序中,第 14 行,personSalary
赋值给 newPersonSalary
。下一行,将 newPersonSalary
中 mike
的工资改为 18000
。那么在 personSalary
中 mike
的工资也将变为 18000
。程序的输出如下:
Original person salary map[steve:12000 jamie:15000 mike:9000]
Person salary changed map[jamie:15000 mike:18000 steve:12000]
将 map 作为参数传递给函数也是一样的。在函数中对 map 的任何修改都会影响在调用函数中看到。
package main
import (
"fmt"
)
func main() {
personSalary := make(map[string]int)
personSalary["steve"] = 12000
personSalary["jamie"] = 15000
personSalary["mike"] = 9000
fmt.Println("personSalary map contents:", personSalary)
value, ok := personSalary["Tom"]
if ok == true {
fmt.Println(value)
} else {
fmt.Println("Tom is not exist")
}
for k, v := range personSalary {
fmt.Println(k, v)
}
fmt.Println("Len: ", len(personSalary))
delete(personSalary, "mike")
for k, v := range personSalary {
fmt.Println(k, v)
}
fmt.Println("Len: ", len(personSalary))
newPersionSalary := personSalary
newPersionSalary["tom"] = 5000
for k, v := range personSalary {
fmt.Println(k, v)
}
fmt.Println("Len: ", len(newPersionSalary))
for k, v := range newPersionSalary {
fmt.Println(k, v)
}
fmt.Println("Len: ", len(newPersionSalary))
}
GoLang基础数据类型---字典的更多相关文章
- GoLang基础数据类型--->字典(map)详解
GoLang基础数据类型--->字典(map)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 可能大家刚刚接触Golang的小伙伴都会跟我一样,这个map是干嘛的,是 ...
- GoLang基础数据类型-切片(slice)详解
GoLang基础数据类型-切片(slice)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 数组的长度在定义之后无法再次修改:数组是值类型,每次传递都将产生一份副本.显然这种数 ...
- GoLang基础数据类型--->数组(array)详解
GoLang基础数据类型--->数组(array)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Golang数组简介 数组是Go语言编程中最常用的数据结构之一.顾名 ...
- GoLang基础数据类型--->字符串处理大全
GoLang基础数据类型--->字符串处理大全 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 欢迎加入: 高级运维工程师之路 59843264 ...
- Python基础数据类型-字典(dict)
Python基础数据类型-字典(dict) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客使用的是Python3.6版本,以及以后分享的每一篇都是Python3.x版本的哟 ...
- golang基础--map字典
map 类似python语言中的dict(字典类型),以key-value形式存储数据 Key必须是支持==或!=比较运算的类型,不可以是函数,map或slice map查找比线性搜素快很多,但比使用 ...
- Python基础数据类型之字典
基础数据类型之字典 ps:数据类型划分:可变数据类型和不可变数据类型. 不可变数据类型:元组(tupe).布尔值(bool).整数型(int).字符串(str).不可变数据类型也称为可哈希. 可变 ...
- python的学习笔记01_4基础数据类型列表 元组 字典 集合 其他其他(for,enumerate,range)
列表 定义:[]内以逗号分隔,按照索引,存放各种数据类型,每个位置代表一个元素 特性: 1.可存放多个值 2.可修改指定索引位置对应的值,可变 3.按照从左到右的顺序定义列表元素,下标从0开始顺序访问 ...
- Py西游攻关之基础数据类型(四)-字典
Py西游攻关之基础数据类型 - Yuan先生 https://www.cnblogs.com/yuanchenqi/articles/5782764.html 七 Dictionary(字典) 字典是 ...
随机推荐
- React 如何适用less
1.使用 create-react-app 创建的项目,默认情况下是看不到 webpack 相关的配置文件,我们需要给它暴露出来,使用下面命令即可: npm run eject 2.添加less np ...
- 下载 python
https://www.python.org/ftp/python/ https://www.cnblogs.com/linxue/p/10097785.html https://blog.csdn. ...
- Powershell基础学习
从吐司偷来的图片,拿来当做引导吧: 0x01 简介 Windows PowerShell 是一种命令行外壳程序和脚本环境,使命令行用户和脚本编写者可以利用 .NET Framework的强大功能.当然 ...
- 《京东B2B业务架构演变》阅读笔记
一.京东 B2B 业务的定位 让各类型的企业都可以在京东的 B 平台上进行采购.建立采购关系. 京东 B2B 的用户群体主要分为 2 类: 一类是大 B 用户.另一类是小 B 用户.京东 B 平台需要 ...
- ubuntu之路——day20 昨天和今天搞定Res18并在GPU上运行 明天YOLO在车辆识别上试一下
- FZU Monthly-201905 tutorial
FZU Monthly-201905 tutorial 题目(难度递增) easy easy-medium medium medium-hard hard 思维难度 AB H DG CE F A. C ...
- 深入SaltStack
[译者注] 这是一篇发表在opencredo官网的博文,通过比较流行的Puppet和新发展起来的Salt,详细地介绍了Salt的功能.在征得原作者的同意后,翻译出来,与大家分享.初次翻译长文,请大家指 ...
- 深度解析 ASP.NET MVC 5
ASP.NET MVC基础 IoC容器 ASP.NET MVC可扩展性 ASP.NET MVC Filters & Cache ASP.NET MVC AJAX ASP.NET MVC Cli ...
- LocalDateTime
@Component public class DateUtil { public final static String EMPTY_SRING = ""; public fin ...
- layui中的table中toolbar自定义过程
自己挖过的坑需要自己来填. layui的table默认表头工具栏右边有3个操作,分别是过滤字段.导出excel.打印功能. 在js中代码添加toolbar即可实现上面的效果: table.render ...