Go语言 减少磁盘片段容量

cnwbcb6i  于 2022-12-07  发布在  Go
关注(0)|答案(3)|浏览(99)

我的问题是关于切片长度和容量的。我正在学习Go语言,请访问:https://tour.golang.org/moretypes/11
(My问题被标记为可能重复this;然而,事实并非如此。我的问题具体是关于切掉切片的前几个元素及其含义。)
为什么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”按钮后,将显示以下内容。

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]
vq8itlhq

vq8itlhq1#

你可以阅读更多关于切片here的内容,但我认为这段话回答了你的问题:
切片并不复制切片的数据。它创建一个指向原始数组的新切片值。这使得切片操作与处理数组索引一样有效。因此,修改重新切片的元素(而不是切片本身)将修改原始切片的元素。
因此,如果将切片数据赋给同一变量,则无法恢复该切片数据。
容量减少是因为通过删除前2个元素,您将更改指向新切片的指针(切片由指向第一个元素的指针引用)。
存储片在内存中的表示方式:

make([]byte, 5)

s = s[2:4]

vybvopom

vybvopom2#

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

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

hmae6n7t

hmae6n7t3#

"golang.org/x/exp/slices"中的slices.Clip可以通过Full slice表达式减少切片的容量。
Clip从切片中删除未使用的容量,返回s[:len(s):len(s)]。
第一个
Playground

相关问题