Golang切片大小调整。两个方向较小,但仅一个方向可能较大?

问题描述 投票:-1回答:1

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

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个元素“听起来很简单”。

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

go slice
1个回答
0
投票

因为切片结构仅具有指向第一个元素,长度和容量的指针。

您可以看到切片运行时表示here

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

© www.soinside.com 2019 - 2024. All rights reserved.