golang中的切片和列表之间是否有区别?

Bob*_*421 1 go

切片和列表之间的差异是否存在差异.

我所理解的是有阵列(固定大小)和切片(动态大小),但两件事之间有区别:

var slice []int
list := []string{"a", "b", "c", "d", "e"}
Run Code Online (Sandbox Code Playgroud)

我想说它们都是片,但我是真的吗?

谢谢

Aar*_*thi 8

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个组成部分组成

  1. ptr - 指向底层数组的指针,
  2. len - 段的长度,
  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)

并且,可以有多个切片指向同一个数组.