我只是想知道,为什么显然无法完全恢复已调整大小的切片。
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个元素“听起来很简单”。
我有一种不正确的理解或 或者我忽略了一些东西。
答案 0 :(得分:2)
因为slice结构仅具有指向第一个元素,整数长度和整数容量的指针。
您可以看到切片运行时表示形式here。
因此,如果将新的slice分配给相同的变量,我们将丢失位于新的第一个元素s = s[1:4]
之前的元素,但是如果分配s = s[:4]
,我们将不会失去slice的容量。
注意:您仍然可以通过反射和指针算术丢失物品,但这并不安全,强烈建议不要这样做。