4.3 切片的操作

一、向slice添加元素

  1. 使用append关键字

    s1 := [...]int{1, 2, 3, 4, 5, 6}
    s2 := s1[:5]
    s3 := append(s2, 7)
    s4 := append(s3, 8)

    结果:

    初始s1=[1 2 3 4 5 6] s2=[1 2 3 4 5] s3=[1 2 3 4 5 7] s4=[1 2 3 4 5 7 8] 最后s1=[1 2 3 4 5 7]

  2. 原因:

    1. 添加元素如果超过cap,系统会重新分配更大的底层数组

    2. 由于值传递的关系,必须接收append的返回值

    3. s = append(s, val)

二、创建切片

  1. 默认创建切片有多中方式:

    // 公用的函数:查看Slice的内容以及len,cap
    func printSlice(s []int) {
    	fmt.Printf("V= %v,len=%d, cap=%d\n", s, len(s), cap(s))
    }
    1. 默认空Slice,后续向内填充内容时候自动扩充

      // 创建Slice	
      var s []int
      
      // 添加内容
      for i := 0; i < 100; i++ {
      	printSlice(s)
      	s = append(s, 2*i+1)
      }
      // 输出内容
      fmt.Println(s)

      备注:默认创建的Slice为nil(相当于null,就是空)

      自动扩充的cap为2n次方,len <= cap

    2. 创建指定长度的Slice

      // 赋予初始值的方式
      s1 := []int{2, 4, 6, 8}
      printSlice(s1)
      
      // 设置cap值的方式
      s2 := make([]int, 16)
      printSlice(s2)

      备注:赋予初始值的方式,len与cap值相同

      设置cap值的方式,len=cap,但值都为0

    3. 指定len与cap的方式

      // 设置lan与cap的方式
      s3 := make([]int, 10, 32)
      printSlice(s3)

      备注:设置了len为10,cap为32,且默认填充内容数量为len默认值都为0

三、复制Slice

  1. 将某个slice复制到另一个slice中

    备注:将s1复制到s2中

    s1=[2 4 6 8]

    s2=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

    复制后s2=[2 4 6 8 0 0 0 0 0 0 0 0 0 0 0 0]

    如果反向复制,那么s2能复制到s1中的内容只有s1的len个(从前向后)

四、删除Slice(很少操作)

  1. 删除中间的数字

    备注:利用append函数进行拼接,使用切片的开闭原则进行拼接,单后面片接的内容是可变长度,因此可以使用...进行指代

    删除后,结果的len会减一,cap不变

五、删除头尾

  1. 删除头部内容

    备注:使用切片操作进行删除头

  2. 删除尾部内容

    备注:同样使用切片方式进行删除

备注:头尾删除跟从中间删除是相同的,结果得到的Slice的len都会发生变化,而cap不会改变

Last updated

Was this helpful?