减少切片容量

时间:2017-04-08 13:04:02

标签: go slice

我的问题是切片长度和容量。我正在学习Go to here:https://tour.golang.org/moretypes/11

(我的问题被标记为this的可能副本;但是,情况并非如此。我的问题是关于切断切片的前几个元素及其含义。)< / p>

s = s[2:]s = s[:4]没有时,为什么行s = s[:0]会减少容量?我看到的唯一区别是s = s[2:]中冒号前面有一个数字,而其他两行中冒号后面有一个数字。

有没有办法恢复我们用s = s[2:]切断的前两个元素?

package main

import "fmt"

func main() {
    s := []int{2, 3, 5, 7, 11, 13}
    printSlice(s)

    // Slice the slice to give it zero length.
    s = s[:0]
    printSlice(s)

    // Extend its length.
    s = s[:4]
    printSlice(s)

    // Drop its first two values.
    s = s[2:]
    printSlice(s)
}

func printSlice(s []int) {
    fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
}

点击“运行”按钮后,我们得到以下内容。

len=6 cap=6 [2 3 5 7 11 13]
len=0 cap=6 []
len=4 cap=6 [2 3 5 7]
len=2 cap=4 [5 7]

2 个答案:

答案 0 :(得分:13)

您可以阅读有关切片here的更多信息。但我认为这段经文回答了你的问题:

  

切片不会复制切片的数据。它创建一个指向原始数组的新切片值。这使切片操作与操作数组索引一样高效。因此,修改重新切片的元素(而不是切片本身)会修改原始切片的元素。

因此,如果要将切片数据分配给同一个变量,则无法恢复切片数据。

容量减少是因为通过删除前两个元素,您正在将指针更改为新切片(切片由指向第一个元素的指针引用)。

如何在内存中表示切片: def

c

memory vis

make([]byte, 5)

slice cap decrease

答案 1 :(得分:0)

您可以使用完整的切片表达式:

package main

func main() {
   s := []int{2, 3, 5, 7, 11, 13}
   { // example 1
      t := s[:0]
      println(cap(t) == 6)
   }
   { // example 2
      t := s[:0:0]
      println(cap(t) == 0)
   }
}

https://golang.org/ref/spec#Slice_expressions