数组与切片

声明与初始化 #

数组 #

  • 声明数组时必须指定长度,长度可以是常量
    var arr [5]int
  • 数组不可以追加元素:
	// var arr = [5]int{1, 2, 3, 4, 5}

	// 数组不可以追加元素
	// arr = append(arr, 6)
  • 声明数组时,可以进行初始化:
	var arr = [5]int{1, 2, 3, 4, 5}
  • 如果声明数组时进行了初始化,也可以不指定长度,使用…来代替
    var arr = [...]int{1, 2, 3, 4, 5}
  • 声明数组时,长度可以是常量
    const length = 5
    var arr [length]int
  • 初始化数组时,可以不从第一个元素开始初始化:
	// 初始化数组时,可以指定下标
	var arr = [5]int{1: 1, 5, 6}

	// [0 1 5 6 0]
	t.Log(arr)
  • 不可以使用make来初始化数组。

切片 #

  • 声明切片时不用指定长度:
	// 声明切片时不用指定长度
	var slice0 []int
  • 切片可以追加元素:
	// 切片可以追加元素
	slice0 = append(slice0, 10)
	t.Log(slice0)
  • 可以使用make来初始化切片,指定长度和容量:
    // 可以使用make来初始化切片,指定长度和容量 ,长度为5,容量为10
    var slice1 = make([]int, 5, 10)
    t.Log(slice1)
  • 可以通过截取数组来初始化切片:
	// 从数组中截取
	arr := [5]int{1, 2, 3, 4, 5}

	// 从数组中截取
	slice := arr[1:3]

	// [2 3]
	t.Log(slice)
	// 2 4
	t.Log(len(slice), cap(slice))

比较 #

数组 #

  • 可以通过 “==” 来比较两个数组:
	arr0 := [5]int{1, 2, 3, 4, 5}
	arr1 := [5]int{1, 2, 3, 4, 5}

	// true
	t.Log(arr0 == arr1)
  • 数组不可以和nil比较:
	// 数组不可以和nil比较
	// var arr = [5]int{1, 2, 3, 4, 5}

	// 报错 invalid operation: arr == nil (mismatched types [5]int and untyped nil)
	// t.Log(arr == nil)

切片 #

  • 两个切片不可以直接用 “==“比较:
    slice0 := []int{1, 2, 3, 4, 5}
    slice1 := []int{1, 2, 3, 4, 5}

	// 报错 invalid operation: slice0 == slice1 (slice can only be compared to nil)
    // t.Log(slice0 == slice1)
  • 切片可以和nil比较:
	// 声明切片时不用指定长度
	var slice0 []int

	t.Log(slice0)

    // true
	t.Log(slice0 == nil)

底层数据结构 #

数组 #

数组的底层数据结构,可以参考sr/go/type/array.go:

type Array struct {
	len  int64
	elem Type
}

切片 #

在src/runtime/slice.go中定义了切片的结构体:

type slice struct {
	array unsafe.Pointer
	len   int
	cap   int
}