内容简介:有 PHP 基础的同学都应该知道,PHP 数组包含索引数组和关联数组,PHP 中的索引数组即对应 Go 语言的数组和切片类型,PHP 中的关联数组即对应 Go 语言中的字典类型(map),所谓字典,其实就是存储键值对映射关系的集合,只不过对于强类型的 Go 语言来说,与 PHP 关联数组的不同之处在于需要在声明时指定键和值的类型,此外 Go 字典是个无序集合,底层不会像 PHP 那样按照元素添加顺序维护元素的存储顺序。下面我们通过一个简单的示例来看看如何在 Go 语言中使用字典这种数据类型:上面这个简单的例
字典定义
有 PHP 基础的同学都应该知道,PHP 数组包含索引数组和关联数组,PHP 中的索引数组即对应 Go 语言的数组和切片类型,PHP 中的关联数组即对应 Go 语言中的字典类型(map),所谓字典,其实就是存储键值对映射关系的集合,只不过对于强类型的 Go 语言来说,与 PHP 关联数组的不同之处在于需要在声明时指定键和值的类型,此外 Go 字典是个无序集合,底层不会像 PHP 那样按照元素添加顺序维护元素的存储顺序。
下面我们通过一个简单的示例来看看如何在 Go 语言中使用字典这种数据类型:
var testMap map[string]int testMap = map[string]int{ "one": 1, "two": 2, "three": 3, } k := "two" v, ok := testMap[k] if ok { fmt.Printf("The element of key %q: %d\n", k, v) } else { fmt.Println("Not found!") }
上面这个简单的例子基本上已经覆盖了 map
的主要用法,下面对其中的关键点进行细述。
字典声明
字典的声明基本上没有多余的元素,比如:
var testMap map[string]int
其中, testMap
是声明的字典变量名, string
是键的类型, int
则是其中所存放的值类型。
字典初始化
我们可以通过先声明再初始化的方式进行初始化,就像上面示例代码做的那样,也可以通过 :=
将声明和初始化合并为一条语句:
testMap := map[string]int{ "one": 1, "two": 2, "three": 3, }
前面我们提到 Go 字典是个无序集合,所以如果我们通过 fmt.Println(testMap)
打印 testMap
的值,得到的可能是下面这样的结果:
map[one:1 three:3 two:2]
此外,还可以像切片那样,通过 Go 语言内置的函数 make()
来初始化一个新字典:
var testMap = make(map[string]int)
通过这种方式初始化后可以像 PHP 关联数组那样往字典中添加键值对(前面那种声明方式不能这么操作,否则编译期间会报 panic):
testMap["one"] = 1 testMap["two"] = 2 testMap["three"] = 3
也可以选择是否在创建时指定该字典的初始存储能力(超出会自动扩容):
testMap = make(map[string]int, 100)
元素赋值
赋值过程非常简单明了,和 PHP 关联数组的赋值操作一致:
testMap["four"] = 4
需要注意的是,字段初始化之后才能进行赋值操作,如果仅仅是声明,此时 testMap
的值为 nil,在 nil 上进行操作编译期间会报 panic(运行时恐慌),导致编译不通过。
查找元素
在 Go 语言中,字典的查找功能设计得比较精巧,要从字典中查找一个特定的键对应的值,可以通过下面的代码来实现:
value, ok := testMap["one"] if ok { // 找到了 // 处理找到的value }
从字典中查找指定键时,会返回两个值,判断是否在字典中成功找到指定的键,不需要检查取到的值是否为 nil
,只需查看第二个返回值 ok
,这是一个布尔值,如果查找成功,返回 true
,否则返回 false
,配合 :=
操作符,让你的代码没有多余成分,看起来非常清晰易懂。
注:Go 语言中的字典和 PHP 关联数组一样,底层都是通过哈希表实现的,添加键值对到字典时,实际是将键转化为哈希值进行存储,在查找时,也是先将键转化为哈希值去哈希表中查询,从而提高性能,但是哈希表存在哈希冲突问题,即不同的键可能会计算出同样的哈希值,这个时候 Go 底层还会判断原始键的值是否相等,如果不相等,也正因如此,我们在声明字典的键类型时,要求数据类型必须是支持通过 ==
或 !=
进行判等操作的类型,比如数字类型、字符串类型、数组类型、结构体类型等,不过为了提高字典查询性能,类型长度越短约好,通常,我们会将其设置为整型或者长度较短的字符串类型。
删除元素
Go 语言提供了一个内置函数 delete()
,用于删除容器内的元素,我们可以通过这个函数来实现字典元素的删除:
delete(testMap, "four")
上面的代码将会从 testMap
中删除键为「four」的键值对。如果「four」这个键不存在,这个调用也不会有什么副作用。但是如果传入的字典未经初始化(值是 nil
),该调用将导致程序抛出 panic。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Algorithms + Data Structures = Programs
Niklaus Wirth / Prentice Hall / 1975-11-11 / GBP 84.95
It might seem completely dated with all its examples written in the now outmoded Pascal programming language (well, unless you are one of those Delphi zealot trying to resist to the Java/.NET dominanc......一起来看看 《Algorithms + Data Structures = Programs》 这本书的介绍吧!