gpt4 book ai didi

go - slice slice 引用

转载 作者:IT王子 更新时间:2023-10-29 01:51:55 27 4
gpt4 key购买 nike

我正在参观 Golang 网站,我正在尝试消化其中一个示例。目前还不清楚它是如何工作的:

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]

在第一个 slice 之后,s = s[:0] slice 长度为 0。然后是另一个 slice s = s[:4]。虽然长度为 0,但这似乎有效。 但是这是怎么发生的?底层数组不应该可以从 s 访问吗?

更让我困惑的是,下次我们对它进行 slice 时,s = s[2:] 我们对 s 的旧值(即 4 个元素)进行 slice ,而不是 原始值数组

谁能阐明这两种情况之间的区别是什么?

最佳答案

slice 基本上是一个指向内存的指针,带有一些附加信息:

1) 当前使用的元素个数和

2)容量,即它能占用的剩余长度。

一开始我们创建了一个包含 6 个整数的 slice ,这使得 go 也创建了总大小为 6 的底层 int 数组。

here is your memory locations with addresses (content does not matter here)
* * * * * *
[0][1][2][3][4][5]
^
s points to the start of the memory
len(s) = 6
cap(s) = 6

接下来我们说:制作这个 slice 的 len为 0,这是 s = s[:0]它采用 s 的子 slice 在位置 0,长度为 0。注意 s[0:0]一样,可以省略第一个0。

[0][1][2][3][4][5]
^
s still points to the start of the memory
len(s) = 0
cap(s) = 6

由于容量仍然相同,我们不妨通过说 s = s[:4] 来使长度为 4 .

 *  *  *  *
[0][1][2][3][4][5]
^
s still points to the start of the memory
len(s) = 4
cap(s) = 6

然后我们通过执行 s = s[2:] 获取一个不在内存开头的子 slice 。 .

       *  *
[0][1][2][3][4][5]
^
s now points to the original address plus two!
len(s) = 2
cap(s) = 4

关于go - slice slice 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52261720/

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