- 前言
- Go 与操作系统
- Go 内部机制
- Go 基本数据类型
- 4 组合类型的使用
- 5 数据结构
- 6 Go package 中不为人知的知识
- 7 反射和接口
- 8 Go UNIX 系统编程
- 08.1 关于 UNIX 进程
- 08.2 flag 包
- 8.2 flag 包
- 08.3 io.Reader 和 io.Writer 接口
- 08.4 bufio 包
- 08.5 读取文本文件
- 08.6 从文件中读取所需的数据量
- 08.7 为什么我们使用二进制格式
- 08.8 读取 CSV 文件
- 08.9 写入文件
- 08.10 从磁盘加载和保存数据
- 08.11 再看strings包
- 08.12 关于bytes包
- 08.13 文件权限
- 08.14 处理 Unix 信号
- 08.15 Unix 管道编程
- 08.16 遍历目录树
- 08.17 使用 ePBF
- 08.18 关于 syscall.PtraceRegs
- 08.19 跟踪系统调用
- 08.20 User ID 和 group ID
- 08.21 其他资源
- 08.22 练习
- 08.23 总结
- 9 并发 Goroutines、Channel 和 Pipeline
- 10 Go 并发-进阶讨论
- 11 代码测试、优化及分析
- 12 Go 网络编程基础
- 13 网络编程 - 构建服务器与客户端
03.4.0 Go 映射 map
Go map(映射,下文不做翻译)就是在其它编程语言中众所周知的哈希表。map数据结构的主要优势就是其可以使用任意数据类型作为键值,但是对于Go map来说并不是所有的数据类型都能作为键值,只有可比较的类型才可以,意思是Go编译器能够区分不同的键值。或者简单来说,Go map的键值必须支持==
操作符。显而易见,使用bool
类型作为map的键值是非常不灵活的。另外,由于不同机器和操作系统的浮点数精度定义不同,使用浮点数作为键值可能会出现异常。
Go map的底层指向了一个哈希表!令人高兴的是Go已经隐藏了哈希表的实现及其复杂性,你将在第五章学习如何使用Go实现一个哈希表。
下面使用make()
函数以string
为键类型,以int
作为值类型创建一个空的map:
iMap := make(map[string]int)
同样也可以使用map字面量创建并初始化一个map:
> anotherMap := map[string]int {
>
> "k1": 12,
>
> "k2": 13
>
> }
可以使用anotherMap["k1"]可以获得对应的值,使用delete()删除一个键值对:
> delete(anotherMap, "k1")
遍历map中得元素可使用如下代码:
> for key, value := range iMap {
>
> fmt.Priintln(key,value)
>
> }
usingMaps.go
中的代码将会更加详细地展示map的用法。代码将会分为3部分,第一部分是:
> package main
>
> import (
> "fmt"
> )
>
> func main() {
> iMap := make(map[string]int)
> iMap["k1"] = 12
> iMap["k2"] = 13
> fmt.Println("iMap:", iMap)
>
> anotherMap := map[string]int {
> "k1": 12,
> "k2": 13,
> }
第二部分是:
> fmt.Println("anotherMap:",anotherMap)
> delete(anotherMap,"k1")
> delete(anotherMap, "k1")
> delete(anotherMap, "k1")
> fmt.Println("anotherMap:",anotherMap)
>
> _, ok := iMap["doseItExist"]
> if ok {
> fmt.Println("Exist!")
> } else {
> fmt.Println("dose NOT exist")
> }
这里你将学习到如何判断map中拥有某个键值对,这是很重要的知识点,如果不了解的话,你将无法判断一个map是否拥有你想要的信息。
需要注意的是,当你尝试使用一个并不存在的键去获取值的时候,返回值是0,但是你并不知道到底是某个键对应的值是0,还是由于所访问的键不存在而返回的0。
另外,代码中多次调用delete()去删除同一个元素并没有导致异常或者警告。
最后一部分代码展示了使用range
关键字遍历map是非常简洁和方便的:
> for key, value := range iMap {
> fmt.Println(key, value)
> }
> }
执行usingMaps.go
将会得到下面的输出:
> $ go run usingMaps.go
>
> iMap: map[k1:12 k2:13]
> anotherMap: map[k1:12 k2:13]
> anotherMap: map[k2:13]
> dose NOT exist
> k1 12
> k2 13
你不能也不应该期望键值对是按顺序打印的,因为遍历map时其顺序是随机的。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论