go-slice切片真好用(2)

109 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第29天,点击查看活动详情

3.生成一个len<cap的slice

为了验证结果更清晰,与上述产生明显对比,我需要生成一个len<cap的slice 代码示例:

func main(){
   a := []int{1, 2, 3}//长度3容量 3
   b := make([]int, 0, 6)//声明一个长度为0容量为6的切片指针变量b
   b = append(b, a...)//a切片赋值给b,ab指向同一底层数组 ->改变值互不影响即对应底层数组不同
   fmt.Println(b, len(b), cap(b))
   fmt.Println(a, len(a), cap(a))

   //各自向a,b新增字段或者改变对应下标的值,看看会不会互相影响
   //新增字段
   a = append(a, 4)
   fmt.Println(a, b) 
   b = append(a, 5)
   fmt.Println(a, b)

   //改变对应下标的值啊
   a[1] = 8
   fmt.Println(a, b)
}

运行结果:

[1 2 3] 3 6
[1 2 3] 3 3
[1 2 3 4] [1 2 3]
[1 2 3 4] [1 2 3 4 5]
[1 8 3 4] [1 8 3 4 5]

4.获取cap下标的值

代码示例:

func main(){
   a := []int{1, 2, 3}//长度3容量 3
   b := make([]int, 0, 6)
   b = append(b, a...)
   fmt.Println(b, len(b), cap(b))

   //获取cap下标的值
   c := b[cap[(b)]
   fmt.Println(c)
}

运行结果:

[1 2 3] 3 6
panic: runtime error: index out of range

5.获取cap开始的切片

代码示例:

func main(){
  a := []int{1, 2, 3}//长度3容量 3
  b := make([]int, 0, 6)
  b = append(b, a...)
  fmt.Println(b, len(b), cap(b))

  c := b[cap(b):]
  fmt.Println(c, len(c), cap(c))
}

运行结果:

[1 2 3] 3 6
panic: runtime error: slice bounds out of range

原因是切片的默认下标是len的值,而cap>len违背的切片左右值i<=j的规定

6.获取cap开始cap结束的切片

代码示例:

func main(){
   a := []int{1, 2, 3}//长度3容量 3
   b := make([]int, 0, 6)
   b = append(b, a...)
   fmt.Println(b, len(b), cap(b))

   //获取cap开始cap结束的切片
   c := b[cap(b):cap(b)]
   fmt.Println(c, len(c), cap(c))

   //附带len开始cap结束的切片
   d := b[len(b):cap(b)]
   fmt.Println(d, len(d), cap(d))
}

运行结果:

[1 2 3] 3 6
[] 0 0
[0 0 0] 3 3

切片的默认值是切片对应类型的”零值“,例如:string的”零值“是空字符串”".