首页 > 后端开发 > Golang > 为什么重新切片 Go Slice 并不总是会减少其容量?

为什么重新切片 Go Slice 并不总是会减少其容量?

Barbara Streisand
发布: 2024-12-17 02:21:24
原创
754 人浏览过

Why Does Re-slicing a Go Slice Not Always Reduce Its Capacity?

Golang 中的重新切片

在 Go 中,切片提供了一种灵活的方式来管理元素集合。虽然创建和访问切片很简单,但理解重新切片的行为可能很棘手。让我们探索一下说明这个概念的代码片段:

package main

import "fmt"

func main() {
    a := make([]int, 5)
    printSlice("a", a)
    b := make([]int, 0, 5)
    printSlice("b", b)
    c := b[:2]
    printSlice("c", c)
    d := c[2:5]
    printSlice("d", d)
}

func printSlice(s string, x []int) {
    fmt.Printf("%s len=%d cap=%d %v\n",
        s, len(x), cap(x), x)
}
登录后复制

这段代码创建了一个长度为 5、容量为 5 的切片 a,后面是长度和容量分别为 0 和 5 的两个切片 b 和 c分别为 2 个。然后将切片 d 创建为 c 的重新切片,起始索引为 2,结束索引为 5。

观察输出时会出现令人困惑的部分:

a len=5 cap=5 [0 0 0 0 0]
b len=0 cap=5 []
c len=2 cap=5 [0 0] //why the capacity of c not 2 but 5 instead
d len=3 cap=3 [0 0 0]
登录后复制

了解重新切片

重新切片时,重要的是请记住,切片不是其底层数组的副本。相反,它们是引用数组一部分的 windows

  • 对于切片 c,它被创建为切片 b 的前两个元素的切片。由于 b 的容量为 5,因此切片 c 可以扩展以包含剩余的三个元素。这就是为什么它的容量保持为 5。
  • 然后将切片 d 创建为 c 的重新切片,起始索引为 2。这意味着 d 引用了 [2, 5)。由于该范围内只剩下三个元素,因此 d 的长度为 3,其容量为 3(因为它是总容量为 5 的较大切片的一部分)。

进一步澄清

下面的代码举例说明了重切片之间的密切关系slices:

func main() {
    b := make([]int, 0, 5)
    c := b[:2]
    d := c[1:5] // this is equivalent to d := b[1:5]
    d[0] = 1
    printSlice("c", c)
    printSlice("d", d)
}
登录后复制

输出:

c len=2 cap=5 [0 1] // modifying d has modified c
d len=4 cap=4 [1 0 0 0] 
登录后复制

这表明修改切片 d 的元素会直接影响切片 c 的元素,从而确认两个切片共享相同的基础数据。

以上是为什么重新切片 Go Slice 并不总是会减少其容量?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板