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(一个读写互斥量,常常用于多线程环境下的并发控制)。这个暂时放到后续博文讲解。

©著作权归作者所有:来自51CTO博客作者Huazie的原创作品,如需转载,请注明出处,否则将追究法律责任

好知识,才能预见未来

赞赏

0人进行了赞赏支持

更多相关文章

  1. 不懂游戏类型?敢说你懂游戏音乐
  2. strcpy
  3. c语言博客第二节
  4. 中文自然语言处理相关的开放任务,数据集,以及当前最佳结果
  5. 就最近看的paper谈谈预训练语言模型发展
  6. C语言二维数组
  7. 学习java的第二天
  8. php7新特性一览
  9. FastAPI基础——请求体-嵌套类型

随机推荐

  1. Android 抽屉导航
  2. Android官方入门文档[4]启动另一个Activi
  3. WebView:Android-H5交互
  4. 梳理uid、userid及UserHandle概念
  5. Android(安卓)安全攻防
  6. Android7.0升级版本适配问题
  7. TextView 不用 ScrollViewe 也可以滚动
  8. Android 两个可拖动的SeekBar 两点拖动
  9. 在Android Studio中使用Android Tests(Jun
  10. 环境配置