Go语言学习6-字典类型

简介: 【1月更文挑战第7天】本篇 Huazie 介绍 Go语言中的字典类型

《Go语言学习系列》

18a325e136e34114b15a6d2caa5b02de.jpeg

引言

上篇我们介绍了Go语言的《切片类型》,本篇我们了解一下Go语言的字典类型。主要如下:

主要内容

在Go语言中,字典类型的官方称谓是Map, 它是哈希表(Hash Table)的一个实现。

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                    //不合法

2. 值表示法

字典值可以由复合字面量来表示。

一个类型为map[string]bool的字典值:

map[string]bool{
   "Vim": true, "Emacs": true, "LiteIDE": true, "Notepad": false}

一个不包含任何键值对的空字典值:

map[string]bool{
   }

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

结语

本篇介绍了 Go 语言的字典类型,下一篇博文介绍 Go 语言的函数类型,敬请期待!!!

目录
相关文章
|
5天前
|
网络协议 安全 Go
Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
【10月更文挑战第28天】Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
26 13
|
1天前
|
测试技术 Go
go语言中测试工具
【10月更文挑战第22天】
8 4
|
1天前
|
SQL 关系型数据库 MySQL
go语言中数据库操作
【10月更文挑战第22天】
10 4
|
1天前
|
缓存 前端开发 中间件
go语言中Web框架
【10月更文挑战第22天】
11 4
|
4天前
|
Go
go语言的复数常量
【10月更文挑战第21天】
17 6
|
4天前
|
Go
go语言的浮点型常量
【10月更文挑战第21天】
11 4
|
4天前
|
编译器 Go
go语言的整型常量
【10月更文挑战第21天】
14 3
|
4天前
|
Serverless Go
Go语言中的并发编程:从入门到精通
本文将深入探讨Go语言中并发编程的核心概念和实践,包括goroutine、channel以及sync包等。通过实例演示如何利用这些工具实现高效的并发处理,同时避免常见的陷阱和错误。
|
5天前
|
安全 Go 开发者
代码之美:Go语言并发编程的优雅实现与案例分析
【10月更文挑战第28天】Go语言自2009年发布以来,凭借简洁的语法、高效的性能和原生的并发支持,赢得了众多开发者的青睐。本文通过两个案例,分别展示了如何使用goroutine和channel实现并发下载网页和构建并发Web服务器,深入探讨了Go语言并发编程的优雅实现。
18 2
|
1天前
|
安全 测试技术 Go
Go语言中的并发编程模型解析####
在当今的软件开发领域,高效的并发处理能力是提升系统性能的关键。本文深入探讨了Go语言独特的并发编程模型——goroutines和channels,通过实例解析其工作原理、优势及最佳实践,旨在为开发者提供实用的Go语言并发编程指南。 ####