Golang中的Slice切片 |青训营笔记

38 阅读1分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天

切片(Slice) 重要!

arr := [...]int {0,1,2,3,4,5,6,7}
 s := arr[2,6]   //2 3 4 5
 s [0] = 10   //arr的值变为[0 1 10 3 4 5 6 7]

复制代码

  • Slice 本身没有数据,是对底层array的一个view
  • Slice 可以 Reslice
  • Slice的扩展
  • Slice可以向后扩展,不可以向前扩展
  • s[i] 不可以超越len(s), 向后扩展不可以超越底层数组cap(s)  ```golang package main  import "fmt"  func main() {      arr := [...]int {1,2,3,4,5,6,7}      s1 := arr[2:6]      s2 := s1[3:5]      fmt.Println("s1= ", s1) //s1 = [2 3 4 5]           fmt.Println("s2= ", s2)  //s2 = [5 6]  }
复制代码


Slice添加元素
   •	添加元素时如果超越cap, 系统会重新分配更大的底层数组,原来的数组(可能会被垃圾回收掉)
   •	由于值传递的关系,必须接受append的返回值
   •	s = append(s, val)
   •	s := make([]int, 16, 32) // len, cap
 package main
 import "fmt"
 func printSlice(s []int) {
     fmt.Printf("len=%d,cap=%d",len(s),cap(s))
 }
 func main(){
     s1 := []int{2,4,6,8}
     printSlice(s1)
     
     s2 := make([]int, 16)
     printSlice(s2)
     
     s3 := make([]int, 10, 32)
     printSlice(s3)
     
     //len=4, cap=4
     //len=16, cap=16
     //len=10, cap=32
 ​
 }
复制代码
Slice复制元素
copy(destination,source)
Slice删除元素
 s2 := []int{2,4,6,8,0,0,0,0,0,0,0}
 fmt.Println("Deleting elements from slice") //delete 8
 s2 = append(s2[:3],s2[4:]...)
 ​
 fmt.Println("Popping from front")
 front := s2[0]
 s2 = s2[1:]
 ​
 fmt.Println("Popping from back")
 tail := s2[len(s2) -1]
 s2 = s2[:len(s2) - 1]