猿问

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

我从数组 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 6

fmt.Println(len(orgArray),cap(orgArray)) //3 3

len(s) 是 4 但 len(orgArray) 只有 3 为什么?


追加时切片的额外元素在哪里存储?


繁花如伊
浏览 182回答 3
3回答

LEATH

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 orgArrays = append(s, "03")fmt.Println(len(s),cap(s))  //3,3 cap is enough. s is pointer to orgArrays = append(s, "04")fmt.Println(len(s),cap(s))  //4,6 cap is not enough. regenerate array. then s point to the new array.

犯罪嫌疑人X

s := orgArray[:2]由于您从原始切片中取出两个元素,然后再添加两个元素,因此长度变为 4。您可以在此处看到四个元素:fmt.Println(s) //[00 01 03 04]如果您想知道为什么容量是 6,那是因为容量以 2 的幂增加。所以如果您有一个容量为 4 的切片并附加 5 个元素,容量将变为 8。这与尝试重新分配内存有关发生 append 时经常出现的切片。
随时随地看视频慕课网APP

相关分类

Go
我要回答