切片和列表之间有区别吗?

时间:2017-11-24 14:00:48

标签: go

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

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

var slice []int
list := []string{"a", "b", "c", "d", "e"}

我想说它们都是片,但我是否正确?

2 个答案:

答案 0 :(得分:6)

var slice []int
list := []string{"a", "b", "c", "d", "e"}

这两个都是切片。

只有在声明中提到大小时才是数组。此尺寸以后不能更改,因此尺寸固定。

var array [5]int
array2 := [3]string{"a","b","c"}

Go Slices & Arrays

当您查看其内部表示时,了解数组和切片之间的差异会更容易。

<强>阵列:

Array是在内存中按顺序排列的值列表。

array:= [4] int {1,2,3,4}

       +-----------------------+
[4]int |  1  |  2  |  3  |  4  |
       +-----------------------+

定义数组后,无法更改其大小。这里的[4]int将始终是4个整数的数组。 [4]int[5]int是不兼容的类型。

<强>切片:

切片类型是基于Go的数组类型构建的抽象。它是数组段的描述符。

它由3个组件组成

  1. ptr - 指向底层数组的指针
  2. len - 段的长度,
  3. 上限 - 及其容量(段的最大长度)。

           +-----+
     []int | ptr |
           +-----+
           | len |
           +-----+
           | cap |
           +-----+
              |
              |
           +-----------------------+
    [4]int |  1  |  2  |  3  |  4  |
           +-----------------------+
    
  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

     

Slice types

     

切片是底层的连续段的描述符   数组并提供对该数字的编号序列的访问   阵列。切片类型表示其所有数组切片的集合   元素类型。未初始化切片的值为零。

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"}