字典类型的声明、初始化和基本使用关联数组对应Go语言中的字典类型(map)。所谓字典,其实就是键值对映射关系的集合,但是对于强类型的Go语言来说,与PHP的关联数组不同的是,它需要在声明的时候指定键值对的类型。另外,Go字典是一个无序集合,底层并没有像PHP一样按照元素的添加顺序来维护元素的存储顺序。下面举一个简单的例子,看看Go语言中如何使用字典作为数据类型:vartestMapmap[string]inttestMap=map[string]int{"one":1,"two":2,"three":3,}k:="two"v,ok:=testMap[k]ifok{fmt.Printf("key%q:%d\n",k,v)}else{fmt.Println("Notfound!")}上面这个简单的例子已经基本涵盖了map的主要用法,下面将对关键点进行详细说明。字典声明字典声明中基本没有多余的元素,例如:vartestMapmap[string]int其中,testMap是声明的字典变量名,string是key的类型,int是存放的value的类型它。字典初始化我们可以像上面的示例代码一样先声明再初始化,也可以通过:=:testMap:=map[string]int{"one":1,"two":2,"three":3,}之前我们提到Go字典是一个无序集合,那么如果我们通过fmt.Println(testMap)打印testMap的值,结果可能如下:map[one:1three:3two:2]另外,和切片一样,可以通过Go语言的内置函数make()初始化一个新的字典:vartestMap=make(map[string]int)这样之后初始化,可以像PHP关联数组一样在字典中加入键值对(之前的声明方式不能这样做,否则编译时会报panic):testMap["one"]=1testMap["two"]=2testMap["three"]=3还可以选择是否在创建字典时指定其初始存储容量(会自动超过则自动展开):testMap=make(map[string]int,100)元素赋值赋值过程非常简单明了,和PHP关联数组的赋值操作是一样的:testMap["four"]=4它需要注意的是赋值操作只能在字段初始化后进行。如果只是一条语句,此时testMap的值为nil,在对nil进行操作时会在编译时报panic(run-timepanic),导致编译失败。查找元素在Go语言中,字典的查找功能设计得比较精致。从字典中查找特定key对应的值,可以使用如下代码实现:value,ok:=testMap["one"]ifok{//Found//处理找到的值}查找时从字典中指定key,会返回两个值,判断是否在字典中成功找到指定key。不需要检查获取的值是否为nil,只看第二个返回值ok,是一个布尔值。如果查找成功则返回true,否则返回false。使用:=运算符,您的代码没有冗余组件,看起来非常清晰易懂。注意:Go语言中的字典与PHP关联数组相同。底层是通过哈希表实现的。将键值对添加到字典中时,实际上是将键转换为哈希值进行存储。将key转换成hash值在hash表中查询,以提高性能,但是hash表存在hash冲突问题,即不同的key可能会计算出相同的hash值。这时候Go的底层也会对原key进行判断。值是否相等,如果不相等,正因如此,我们在声明字典的key类型时,数据类型必须是支持通过==或!=进行判断操作的类型,比如数值类型,字符串类型,数组类型,结构类型等,但是为了提高字典查询性能,类型长度越短越好,通常我们会设置为整型或者更短的字符串类型。删除元素Go语言提供了一个内置函数delete(),用于删除容器中的元素。我们可以使用这个函数来删除字典元素:delete(testMap,"four")上面的代码会从testMap中删除一个键为“four”的键值对。如果键“四”不存在或字典尚未初始化,此调用将没有副作用。
