gpt4 book ai didi

go - 试图更好地了解 slice 的行为

转载 作者:行者123 更新时间:2023-12-01 20:23:48 25 4
gpt4 key购买 nike

当我阅读Go中的片段时,它们似乎足够合理。
我知道 slice 结构具有基于基础数组的容量和当前包含的元素的长度,并且 slice 还引用了下面的数组。
但是,当我玩转Go的"A Tour of Go"时,
我不明白为什么以下内容会降低基础数组的容量。

package main

import "fmt"

func main() {
s := []int{2, 3, 5, 7, 11, 13}
printSlice(s)

s = s[1:5]
printSlice(s)

s = s[:0]
printSlice(s)

s = s[0:5]
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=4 cap=5 [3 5 7 11]
len=0 cap=5 []
len=5 cap=5 [3 5 7 11 13]
为什么在第一次调用 printSlice(s)和第二次调用之间容量发生变化?

最佳答案

底层数组的长度最初为六,这也是 slice 的容量。
当您使用s = s[1:5]进行 slice 时,实际上是在“忽略”基础数组的第一个元素,因此剩下五个元素,这就是 slice 的新容量。

Originally:

| <------- array -------> |
| 2 | 3 | 5 | 7 | 11 | 13 |
| <------- slice -------> |

After reslicing:

| <------- array -------> |
| 2 | 3 | 5 | 7 | 11 | 13 |
| <----- slice -----> |

The array underlying a slice may extend past the end of the slice. The capacity is a measure of that extent: it is the sum of the length of the slice and the length of the array beyond the slice.


https://golang.org/ref/spec#Slice_types
请注意,它表示超出 slice (在这种情况下,超出 slice 的数组的长度为零)。 slice 开始之前可能存在的任何数组元素都不计入 slice 的容量。实际上,除非存在另一个引用该数组区域的 slice ,否则这些元素是完全不可访问的。
为了使容量保持为六个,Go必须创建一个新的大小为六的数组,并将原始数组的最后五个元素复制到新数组的开头,但是 slice 永远不会更改基础数组。

关于go - 试图更好地了解 slice 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63669175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com