猿问

Golang 切片调整大小。在两个方向上更小,但在一个方向上可能更大?

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


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


我感觉我没有正确理解某事,或者我忽略了某事。


神不在的星期二
浏览 182回答 1
1回答

守着星空守着你

因为 slice 结构只有一个指向第一个元素的指针,整数长度和整数容量。您可以在此处查看切片运行时表示。因此,如果我们为同一个变量分配一个新切片,我们将丢失位于新第一个元素之前的元素s = s[1:4],但如果分配s = s[:4]我们不会丢失切片的容量。注意:您仍然可以使用反射和指针算法丢失项目,但它不安全,并且强烈不推荐。
随时随地看视频慕课网APP

相关分类

Go
我要回答