go - Golang slice 调整大小。在两个方向上较小,但在一个方向上可能较大?

标签 go slice

我只是想知道,为什么显然无法完全恢复已调整大小的 slice 。

package main

import (
    "fmt"
)

func main() {
    s := []int{1, 2, 3, 4, 5}
    fmt.Printf("len=%d cap=%d slice=%v\n", len(s), cap(s), s)
    fmt.Println("address of 0th element:", &s[0])

    s = s[1:4]
    fmt.Printf("len=%d cap=%d slice=%v\n", len(s), cap(s), s)
    fmt.Println("address of 0th element:", &s[0])

    // extend behind only ...
    s = s[:4]
    fmt.Printf("len=%d cap=%d slice=%v\n", len(s), cap(s), s)
    fmt.Println("address of 0th element:", &s[0])
}

https://play.golang.org/p/4Hwq9yfHeRR

因此,再次获得第一个元素(1)。在某些情况下这可能会有所帮助。
我读过https://blog.golang.org/slices ...但我听不懂
他们为什么这样做呢?要存储起始位置和
数组的第0个元素“听起来很简单”。

我有一种不正确的理解或
或者我忽略了一些东西。

最佳答案

因为slice struct只有一个指向第一个元素的指针,所以它是整数长度和整数容量。

您可以看到 slice 运行时表示形式here

因此,如果将新的slice分配给相同的变量,我们将丢失位于新的第一个元素s = s[1:4]之前的元素,但是如果分配s = s[:4],我们将不会失去slice的容量。

注意:您仍然可以使用反射和指针算法获得丢失的物品,但是它不安全,强烈建议不要这样做。

关于go - Golang slice 调整大小。在两个方向上较小,但在一个方向上可能较大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59909614/

相关文章:

arrays - Golang 子 slice

python - 提取列表中奇数位置的元素

string - 如何将 int slice 的字符串转换为 int slice ?

arrays - 通过带有起始和长度说明符的引用传递静态/动态数组的切片

Golang 类型系统不一致(http包)

go - 为什么同样的值用两种方式转换,结果却不同呢?

go - 将接口(interface)方法实现为指针接收器或值接收器的结构

go - 我怎么能从 golang 源复制一个包来破解

go - 合并排序计数器 slice

Swift 中的 ArraySlice 索引超出范围