2017-04-08 51 views
7

我的问题是关于切片长度和容量。我在这里学习Go:https://tour.golang.org/moretypes/11降低切片容量

(我的问题被标记为的this可能重复的;然而,这不是的情况下我的问题是特别关于切断的切片的前几个元素与该影响)

s = s[:4]s = s[:0]不行时,为什么行s = s[2:]减少了容量?我看到的唯一区别是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] 
+0

的可能的复制(HTTP:// stackoverflow.com/questions/36683911/go-slices-capacity-length)(回答:“容量将是直到最后一个bac的第一个元素国王阵列“) – kennytm

+0

可能的重复[是否没有真正的方法来缩小切片?这是一个问题吗?](http://stackoverflow.com/questions/16748330/does-go-have-no-real-way-to-shrink-a-slice-is-that-an-issue) – Flimzy

回答

8

您可以阅读更多关于切片here。但我认为这段话回答你的问题:

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

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

容量减少的原因是通过删除前2个元素来更改指向新切片的指针(切片由指向第一个元素的指针引用)。

如何切片在存储器中表示:[?转到切片 - 容量/长度] def

make([]byte, 5) 

memory vis

s = s[2:4] 

slice cap decrease

+0

谢谢,亚历克斯。该链接非常有帮助。 我没有完全按照你在这里发布的图表,直到我查看了链接上方的图表。 (我不明白,蓝色,紫色和粉红色方块代表片内部。) – Pizzas

+0

我已经更新了答案,使其更易于理解。 –