3. Go语言数据类型
上篇我们介绍了Go语言的切片类型,本篇我们了解一下Go语言的字典类型。主要如下:
3.4 字典
在Go语言中,字典类型的官方称谓是Map, 它是哈希表(Hash Table)的一个实现。
3.4.1 类型表示法
如果一个字典类型的键的类型为K,且元素的类型为T,那么用于表示这个字典类型的类型字面量:
map[K]T
字典类型声明中的元素类型可以是任意一个有效的Go语言数据类型(除了函数类型、字典类型或切片类型)。键的类型必须是可比较的。如果字典类型的键类型是接口类型,那么就要求在程序运行期间,该类型的字典值中的每一个键值的动态类型都必须是可比较的。否则在进行相应操作的时候会引发运行时异常。如下:
map[int]string//合法
map[string]struct{name, department string}//合法
map[string]interface{}//合法
map[[]int]string//不合法
map[map[int]string]string//不合法
3.4.2 值表示法
字典值可以由复合字面量来表示。
一个类型为map[string]bool的字典值:
map[string]bool{"Vim": true, "Emacs": true, "LiteIDE": true, "Notepad": false}
一个不包含任何键值对的空字典值:
map[string]bool{}
3.4.3 属性和基本操作
与指针类型和切片类型一样,字典类型是一个引用类型。与切片值相同,一个字典值总是会持有一个针对某个底层数据结构值的引用。
知识点:在Go语言中,只有“传值”而没有“传引用”。函数内部对参数值的改变是否会在该函数之外体现出来(或者说是否反映在该参数值的原值上),只取决于这个被改变的值的类型是值类型还是引用类型。
因为字典类型是引用类型,所以它的零值是nil。一个值为nil的字典类型的变量类似于一个长度为0的空字典。对它的读操作不会引起任何错误,但是对它的写操作(添加或删除键值对)将会引起一个运行时恐慌。一个未初始化的字典类型的变量的值就是nil。
这里声明并初始化一个字典类型的变量,如下:
editorSign := map[string]bool{"LiteIDE": true, "Notepad": false}
添加键值对,如下:
editorSign["Vim"] = true
通过索引表达式在一个字典中查找并获取与指定键值对应的那个元素值,如下:
sign1 := editorSign["Vim"]
当editorSign的值中没有键为“Vim”的键值对时,变量sign1将会被赋予editorSign的元素类型的零值,即false。
sign1, ok := editorSign["Vim"]
变量ok将会是布尔类型,它的值表明了在editorSign的值中是否存在键为“Vim”的键值对。
删除键值对,如下:
delete(editorSign, "Vim")
注意: 字典值并不是并发安全的!Go语言官方认为,在大多数使用字典值的地方并不需要多线程场景下的安全访问控制。保证并发安全性,需要使用标准库代码包sync中的结构体类型RWMutex(一个读写互斥量,常常用于多线程环境下的并发控制)。这个暂时放到后续博文讲解。
有疑问加站长微信联系(非本文作者)