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

如果切片的大小超过数组的大小,切片的元素将存储在哪里?

如果切片的大小超过数组的大小,切片的元素将存储在哪里?

Go
繁花如伊 2021-08-01 08:44:17
我从数组 OrgArray 创建一个切片,如下所示orgArray:=[3] string{"00","01","02"}s := orgArray[:2]s = append(s,"03")s = append(s,"04")'s' 是我在数组 'orgArray' 上建立的切片如果我打印 s 和 orgArray 的大小fmt.Println(s) //[00 01 03 04]fmt.Println(len(s),cap(s)) //4 6fmt.Println(len(orgArray),cap(orgArray)) //3 3len(s) 是 4 但 len(orgArray) 只有 3 为什么?追加时切片的额外元素在哪里存储?
查看完整描述

3 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

slice 的结构是这样的:


struct Slice

{ // must not move anything

 byte* array; // actual data

 uintgo len; // number of elements

 uintgo cap; // allocated number of elements

};

在你的例子中。解释如下:


orgArray := [3]string{"00", "01", "02"}

s := orgArray[:2]

fmt.Println(len(s),cap(s))  //2,3 s is pointer to orgArray

s = append(s, "03")

fmt.Println(len(s),cap(s))  //3,3 cap is enough. s is pointer to orgArray

s = append(s, "04")

fmt.Println(len(s),cap(s))  //4,6 cap is not enough. regenerate array. then s point to the new array.


查看完整回答
反对 回复 2021-08-02
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

s := orgArray[:2]

由于您从原始切片中取出两个元素,然后再添加两个元素,因此长度变为 4。您可以在此处看到四个元素:

fmt.Println(s) //[00 01 03 04]

如果您想知道为什么容量是 6,那是因为容量以 2 的幂增加。所以如果您有一个容量为 4 的切片并附加 5 个元素,容量将变为 8。这与尝试重新分配内存有关发生 append 时经常出现的切片。


查看完整回答
反对 回复 2021-08-02
  • 3 回答
  • 0 关注
  • 181 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信