首页 > 解决方案 > 即使在切片和变异之后,为什么/如何保留其初始化值?

问题描述

我正在学习 go 的基础知识,在这里的游览中找到了这个。

我不明白为什么数组值不是 0 或 nil 之后s = s[:0]

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]

标签: arraysgo

解决方案


切片是数组上的视图。如果超出容量,切片只会创建一个新的更大的数组并复制内容。如果截断切片,切片将继续使用其原始数组。当您创建一个较小的切片时,它仍然使用旧的支持数组,其中包含先前操作的剩余内容。当您追加到该切片时,它将继续使用相同的数组,直到您超出容量。


推荐阅读