为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
神不在的星期二 2022-05-10 13:44:07
我只是想知道,为什么显然不可能完全恢复调整大小的切片。package mainimport (    "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 个元素“听起来很简单”。我感觉我没有正确理解某事,或者我忽略了某事。
查看完整描述

1 回答

?
守着星空守着你

TA贡献1799条经验 获得超8个赞

因为 slice 结构只有一个指向第一个元素的指针,整数长度和整数容量。

您可以在此处查看切片运行时表示。

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

注意:您仍然可以使用反射和指针算法丢失项目,但它不安全,并且强烈不推荐。


查看完整回答
反对 回复 2022-05-10
  • 1 回答
  • 0 关注
  • 181 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号