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。
进一步澄清
下面的代码举例说明了重切片之间的密切关系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中文网其他相关文章!