Go 语言函数式编程系列(十一) —— 数据类型篇:字典类型的声明、初始化和基本使用

栏目: PHP · 发布时间: 5年前

内容简介:有 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。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Java核心技术·卷 I(原书第10版)

Java核心技术·卷 I(原书第10版)

[美] 凯.S.霍斯特曼(Cay S. Horstmann) / 周立新 等 / 机械工业出版社 / 2016-9 / CNY 119.00

Java领域最有影响力和价值的著作之一,由拥有20多年教学与研究经验的资深Java技术专家撰写(获Jolt大奖),与《Java编程思想》齐名,10余年全球畅销不衰,广受好评。第10版根据Java SE 8全面更新,同时修正了第9版中的不足,系统全面讲解了Java语言的核 心概念、语法、重要特性和开发方法,包含大量案例,实践性强。 一直以来,《Java核心技术》都被认为是面向高级程序员的经典教......一起来看看 《Java核心技术·卷 I(原书第10版)》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具