切片和列表之间的差异是否存在差异.
我所理解的是有阵列(固定大小)和切片(动态大小),但两件事之间有区别:
var slice []int
list := []string{"a", "b", "c", "d", "e"}
Run Code Online (Sandbox Code Playgroud)
我想说它们都是片,但我是真的吗?
谢谢
var slice []int
list := []string{"a", "b", "c", "d", "e"}
Run Code Online (Sandbox Code Playgroud)
这两个都是切片.
只有在声明中提到大小时才是数组.此尺寸以后不能更改,因此尺寸固定.
var array [5]int
array2 := [3]string{"a","b","c"}
Run Code Online (Sandbox Code Playgroud)
当您查看其内部表示时,了解数组和切片之间的差异会更容易.
阵:
Array是在内存中按顺序排列的值列表.
array:= [4] int {1,2,3,4}
+-----------------------+
[4]int | 1 | 2 | 3 | 4 |
+-----------------------+
Run Code Online (Sandbox Code Playgroud)
定义数组后,无法更改其大小.在[4]int
这里将一直保持的4个整数数组.[4]int
并且[5]int
是不兼容的类型.
切片:
切片类型是基于Go的数组类型构建的抽象.它是数组段的描述符.
它由3个组成部分组成
上限 - 及其容量(段的最大长度).
+-----+
[]int | ptr |
+-----+
| len |
+-----+
| cap |
+-----+
|
|
+-----------------------+
[4]int | 1 | 2 | 3 | 4 |
+-----------------------+
Run Code Online (Sandbox Code Playgroud)可以修改切片以指向具有相同或不同大小的不同阵列.因此,切片具有动态大小.
slice1 := []int{1,2,3}
+-----------------+
slice1 | ptr | 3 | 3 |
+-----------------+
slice1 = []int{1,2}
+-----------------+
slice1 | ptr | 2 | 2 |
+-----------------+
Run Code Online (Sandbox Code Playgroud)
并且,可以有多个切片指向同一个数组.