Golang 分片
在Go语言中,slice比数组更强大、更灵活、更方便,是一种轻量级的数据结构。切片是一个可变长度的序列,它存储相似类型的元素,你不允许在同一个切片中存储不同类型的元素。它就像一个有索引值和长度的数组,但片断的大小是可以调整的,它们不像数组那样有固定的大小。在内部,slice和数组是相互联系的,slice是对一个底层数组的引用。分片 中的第一个索引位置总是0,最后一个是(分片的长度-1)。
分片的声明
一个片断的声明就像一个数组,但它不包含片断的大小。所以它可以根据需求增长或缩小。
语法
这里,T是元素的类型。比如说。
切片的组成部分
一个片断包含三个组成部分。
- 指针 : 指针用来指向数组的第一个元素,该元素可以通过分片访问。在这里,不需要指出的元素是数组的第一个元素。
- 长度: 长度是数组中存在的元素总数。
- 容量: 容量表示它可以扩展到的最大尺寸。
让我们借助一个例子来讨论所有这些组成部分。
例子
输出
解释: 在上面的例子中,我们从给定的数组中创建一个分片。这里分片的指针指向索引1,因为分片的下限被设置为1,所以它从索引1开始访问元素。分片的长度是5,这意味着分片中存在的元素总数是5,分片的容量是6,意味着它最多可以存储6个元素。
如何创建和初始化一个片断?
在Go语言中,可以通过以下方式来创建和初始化一个分片。
- 使用slice literal: 你可以使用slice literal来创建一个slice。创建slice literal和数组 literal一样,但有一点不同的是,你不允许在方括号[]中指定slice的大小。如下面的例子所示,这个表达式的右边是分片的字面意思。
注意: 一定要记住,当你使用字符串字头创建一个片断时,它首先创建一个数组,然后返回一个片断引用。
例子
输出
- 使用数组: 我们已经知道slice是数组的引用 ,所以你可以从给定的数组中创建一个slice。为了从给定的数组中创建一个分片,首先你需要指定下限和上限,这意味着分片可以从数组的下限到上限中获取元素。它不包括从上界开始的元素。如下面的例子所示:
语法
这个语法将返回一个新的片断。
注意: 下限的默认值是0,上限的默认值是给定数组中元素的总数。
例子
输出
- 使用已经存在的片断: 也允许从给定的片断创建一个片断。为了从给定的片断创建一个片断,首先你需要指定下限和上限,这意味着片断可以从给定的片断中抽取元素,从下限开始到上限。它不包括从上界开始的元素。如下面的例子所示:
语法
这个语法将返回一个新的片断。
注意: 下限的默认值是0,上限的默认值是给定片断中存在的元素总数。
例子
输出
- 使用make()函数: 你也可以使用go库提供的
make()
函数 来创建一个片子。这个函数需要三个参数,即类型、长度和容量。这里,容量值是可选的。它分配了一个底层数组,其大小等于给定的容量,并返回一个指向底层数组的片断。一般来说,make()函数是用来创建一个空片的。这里,空片是那些包含空数组引用的片子。
语法
例子
输出
如何在一个切片上迭代?
你可以通过以下方式对分片进行迭代。
- 使用for循环: 这是迭代分片的最简单方法,如下例所示:
例子
输出
- 在for循环中使用范围: 允许在for循环中使用范围来迭代一个片断。在for循环中使用range,你可以得到索引和元素值,如例子所示:
例子
输出
- 在for循环中使用空白标识符: 在范围for循环中,如果你不想获得元素的索引值,那么你可以使用空白(_)来代替索引变量,如下例所示:
例。
输出
关于Slice的重要观点
- 零值分片: 在Go语言中,你可以创建一个不包含任何元素的零值分片。所以这个片断的容量和长度都是0。无片断不包含数组引用,如下例所示:
例子
输出
- 修改slice: 我们已经知道slice是一个引用类型,它可以引用一个底层数组。因此,如果我们改变了切片中的一些元素,那么这些改变也应该发生在引用的数组中。或者换句话说,如果你在切片中做了任何改变,那么它也会反映在数组中,如下面的例子所示:
例
输出
- 片断的比较: 在片断中,你只能使用 == 运算符来检查给定的片断是否为零。如果你试图用 == 运算符来比较两个片断,那么它会给你一个错误,如下面的例子所示:
例子
输出
注意: 如果你想比较两个片断,那么使用range for loop来匹配每个元素,或者你可以使用 DeepEqual
函数。
- 多维切片: 多维切片就像多维数组一样,只是切片不包含大小。
例子
输出
- 分片的排序: 在Go语言中,你可以对分片中的元素进行排序。Go语言的标准库提供了排序包,其中包含了不同类型的排序方法,用于对ints、 float64s和strings的片断进行排序。 这些函数总是以升序对切片中的元素进行排序。
例子
输出