golang基础小记(8)——切片:make()函数构造、append()添加元素、copy()复制切片、删除元素

make()函数构造

make()函数能动态的构造切片,控制新切片的长度容量,格式如下:

s := make([]T, len, cap)

其中T表示切片的元素类型;len表示切片的长度,每个元素初始化为对应类型的零值;cap表示切片的容量,默认等于len,且cap >= len
make()函数构造的切片必然不是零值,示例如下:

s := make([]int, 0, 0)
fmt.Println(s == nil) // false

所以判断切片是否为空时,应该用len(s) == 0

append()添加元素

append()函数能让切片动态添加元素,可以添加一个元素,也可以添加多个元素,还可以添加其他切片(包括自己)的元素,示例如下:

// 只声明而不初始化的切片也能直接添加元素
var s3 []int
s3 = append(s3, 1)     // [1]
s3 = append(s3, 2, 3)  // [1 2 3]
s4 := []int{4, 5, 6}
s3 = append(s3, s4...) // [1 2 3 4 5 6]

如果切片容量足够,那么添加元素后依旧指向原来的底层数组;如果容量不足,那么切片会自动扩容,并指向新的底层数组。

copy()复制切片

如果直接用=复制切片,比如a := b,那么ab指向的是同一个底层数组,改变a的时候b也会同步改变。
copy()函数能解决这个问题,示例如下:

s5 := []int{1, 2, 3}
s6 := make([]int, 3)
copy(s6, s5) // 参数一表示目标切片,参数二表示数据来源切片
s5[0] = 3
fmt.Println(s5, s6) // [3 2 3] [1 2 3]

切片复制默认从目标切片的第一个元素开始复制,可以利用再切片调整复制的位置,示例如下:

s7 := make([]int, 6)
copy(s7[2:], s6) // s6 = [1 2 3]
fmt.Println(s7)  // [0 0 1 2 3 0]

如果目标切片的长度小于数据来源切片,以目标切片长度为准,示例如下:

s8 := make([]int, 2)
copy(s7, s6)    // s6 = [1 2 3]
fmt.Println(s7) // [1 2]

删除元素

没有专门删除元素的方法,可以利用append()函数来删除元素。

  • 删除索引为i的元素:s = append(s[:i], s[i+1:]...)
  • 删除索引在[i, j]范围的元素:s = append(s[:i], s[j+1:]...)
s := []int{1, 2, 3, 4, 5}
s = append(s[:1], s[2:]...)
fmt.Println(s, len(s), cap(s)) // [1 3 4 5] 4 5
s = append(s[:0], s[2:]...)
fmt.Println(s, len(s), cap(s)) // [4 5] 2 5

参考

你可能感兴趣的:(golang基础小记)