【发布时间】:2023-03-18 14:07:01
【问题描述】:
我的问题是关于切片长度和容量。我在这里学习 Go:https://tour.golang.org/moretypes/11。
(我的问题被标记为可能与 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)
}
点击运行按钮后,我们得到以下内容。
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]
【问题讨论】:
-
Go slices - capacity/length? 的可能重复项(答案:“容量将是第一个元素,直到后备数组的最后一个元素”)
-
其他新人可以阅读这个答案stackoverflow.com/a/62638755/4693568。
-
谁能解释一下我们如何能够打印来自
s[:0]到s[:4]的[2,3,5,7]。但是当我们从s[:4]到s[2:]时,go 似乎忘记了最后两个元素11,13并且只打印了[5,7],即使它有足够的容量。我浏览了this 链接,仍然找不到答案。