减少切片容量

Piz*_*zas 15 go slice

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

(我的问题被标记为的可能重复 ;然而,这不是这种情况我的问题是特别关于切断的切片的前几个元素和其含义.).

为什么线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)
}
Run Code Online (Sandbox Code Playgroud)

单击"运行"按钮后,我们得到以下内容.

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]
Run Code Online (Sandbox Code Playgroud)

Ale*_*mov 15

你可以阅读更多关于切片这里.但我认为这段经文回答了你的问题:

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

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

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

切片如何在内存中表示: 高清

make([]byte, 5)
Run Code Online (Sandbox Code Playgroud)

记忆力

s = s[2:4]
Run Code Online (Sandbox Code Playgroud)

切片上限减少

  • 当我阅读golang教程时,我问自己同样的问题.Alex在这里完美地回答,我认为教程作者的错误是不解释为什么会出现这种行为. (5认同)
  • 谢谢你,亚历克斯。该链接非常有帮助。在我查看链接中上面的图表之前,我并没有完全按照您在此处发布的图表进行操作。(我不明白蓝色、紫色和粉色方块代表切片的内部。) (2认同)