Golang 中 slice 和 array 有何不同?

Go语言的slice与数组存在以下主要的区别:

  1. 切片是对数组的抽象视图
    Slice是一个结构体,它包含数组指针和长度信息。
  2. 长度可变
    Slice的长度可以动态增长,而数组长度在定义时固定。
  3. 空间分配不同
    数组需要在定义时确定空间,切片是引用底层数组。
  4. 创建方式
    数组通过直接指定元素个数创建,切片使用make()函数创建。
var a [10]int
b := make([]int, 0)
  1. 内存开销不同
    数组存储实际元素值,切片存储长度和容量信息。
  2. 传参方式
    传递数组时会复制整个数组,传递切片只复制指针。
  3. 语法不同
    数组使用a[n]访问元素,切片使用 s[n:m]访问部分元素。

总的来说,二者的主要区别在于:

  • 切片是对数组的抽象
  • 切片的长度可变,数组固定
  • 数组需要分配内存,切片引用数组
  • 创建方式不同
  • 内存开销不同
  • 传参方式不同
  • 语法不同

综上,数组应用于需要固定大小的场景,切片用于需要动态增长的场景。二者配合使用可以实现更高效的数据结构。