7.2 切片

Kesa...大约 2 分钟

7.2 切片

7.2.1 概念

  • 切片(slice) 是对数组的一个连续片段的引用。

  • 长度:切片可索引的长度,可通过len() 获取

  • 容量:切片对应底层数组的长度,可通过cap()获取

  • 长度和容量满足不等式: 0 <= len(s) <= cap()

  • 多个切片若底层数组相同,则切片之间的数组是共享的

  • 声明

    var identifier []type
    

    未初始化的切片值为nil, 长度为0

  • 初始化:

    // 通过数组初始化
    var slice []type = arr[start:end]
    // 通过数组常量, 例如
    var slice = []int{1, 2, 3}
    

    表示切片由数组的 startend-1 之间的元素构成。 [start:end]为切片表达式:

    • [:]: 相当于[0:len(arr)]
    • [n:]: 相当于[n:len(arr)]
    • [:m]: 相当于[0:m]

底层结构

切片在内存中的实际上是有三个域的结构体:

  • 指向相关数组的指针
  • 切片长度
  • 切片容量
image-20230503192833602
image-20230503192833602

7.2.2 将切片传给函数

若函数需要操作数组,可将其切片作为参数:

func sum(a []int) int {
	s := 0
	for i := 0; i < len(a); i++ {
		s += a[i]
	}
	return s
}

func main() {
	var arr = [5]int{0, 1, 2, 3, 4}
	sum(arr[:])
}

7.2.3 使用 make() 创建切片

可以使用make()创建切片:

var slice []type = make([]type, len, cap)
  • 省略cap: make([]type, len) 那么cap将等于len
image-20230503193523762
image-20230503193523762

7.2.4 new() 和 make() 的区别

  • new(T): 为类型T分配一片内存,初始化零值并返回类型为*T的指针 返回一个指向类型为T,值为零值的地址的指针 适用于数组结构体
  • make(T)返回类型为T的初始值 适用于内建的引用类型:slice, map 和 channel
image-20230503194251351
image-20230503194251351

换句话说就是,new()只会分配内存和初始化变量,而对于slice, map 和 channel 来说,其底层对应的数据结构并没有初始化,所以需要使用 make() 来进行初始化。

7.2.5 多维切片

和数组一样可以由一维组成多维。

7.2.6 bytes 包

[]byte类型比较常见,可以使用 bytes包专门处理,详见 bytesopen in new window

上次编辑于:
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.2