切片和列表之间是否存在差异。
我所理解的是阵列(固定大小)和切片(动态大小),但这两件事之间有区别:
var slice []int
list := []string{"a", "b", "c", "d", "e"}
我想说它们都是片,但我是否正确?
答案 0 :(得分:6)
var slice []int
list := []string{"a", "b", "c", "d", "e"}
这两个都是切片。
只有在声明中提到大小时才是数组。此尺寸以后不能更改,因此尺寸固定。
var array [5]int
array2 := [3]string{"a","b","c"}
当您查看其内部表示时,了解数组和切片之间的差异会更容易。
<强>阵列:强>
Array是在内存中按顺序排列的值列表。
array:= [4] int {1,2,3,4}
+-----------------------+
[4]int | 1 | 2 | 3 | 4 |
+-----------------------+
定义数组后,无法更改其大小。这里的[4]int
将始终是4个整数的数组。 [4]int
和[5]int
是不兼容的类型。
<强>切片:强>
切片类型是基于Go的数组类型构建的抽象。它是数组段的描述符。
它由3个组件组成
上限 - 及其容量(段的最大长度)。
+-----+
[]int | ptr |
+-----+
| len |
+-----+
| cap |
+-----+
|
|
+-----------------------+
[4]int | 1 | 2 | 3 | 4 |
+-----------------------+
可以修改切片以指向相同或不同的数组 不同的大小。因此,切片具有动态大小。
slice1 := []int{1,2,3}
+-----------------+
slice1 | ptr | 3 | 3 |
+-----------------+
slice1 = []int{1,2}
+-----------------+
slice1 | ptr | 2 | 2 |
+-----------------+
并且,可以有多个切片指向同一个数组。
答案 1 :(得分:1)
The Go Programming Language Specification
切片是底层的连续段的描述符 数组并提供对该数字的编号序列的访问 阵列。切片类型表示其所有数组切片的集合 元素类型。未初始化切片的值为零。
SliceType = "[" "]" ElementType .
Go切片是底层数组的切片。 Go没有列表。在Go中,您可以使用切片实现列表。
这些都是Go切片。列表也不是。
var intSlice []int
strSlice := []string{"a", "b", "c", "d", "e"}
intSlice
被初始化为切片的零值nil
。底层array.for strSlice
的元素被初始化为切片复合文字值{"a", "b", "c", "d", "e"}
。