如果slice的大小超过数组大小,那么slice的元素将在哪里存储?

时间:2014-03-20 11:49:43

标签: go

我从数组OrgArray创建一个切片,如下所示

orgArray:=[3] string{"00","01","02"}
s := orgArray[:2]
s = append(s,"03")
s = append(s,"04")

在哪里'是我在阵列上构建的切片' 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个为什么?

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

3 个答案:

答案 0 :(得分:5)

  

The Go Programming Language Specification

     

Appending to and copying slices

     

如果s的容量不足以容纳附加值,   append分配一个适合的新的,足够大的底层数组   现有的切片元素和附加值。除此以外,   append重新使用底层数组。

有关append内置函数如何工作的其他详细信息,请阅读此博文:

Arrays, slices (and strings): The mechanics of 'append'

另外,请参阅此StackOverflow答案,其中说明了重新分配容量计算:

append complexity

例如,

package main

import "fmt"

func main() {
    orgArray := [3]string{"00", "01", "02"}
    fmt.Println("orgArray:", &orgArray[0], len(orgArray), orgArray)
    s := orgArray[:2]
    fmt.Println("       s:", &s[0], len(s), cap(s), s)
    s = append(s, "03")
    fmt.Println("       s:", &s[0], len(s), cap(s), s)
    s = append(s, "04")
    fmt.Println("       s:", &s[0], len(s), cap(s), s)
    fmt.Println("orgArray:", &orgArray[0], len(orgArray), orgArray)
}

输出:

orgArray: 0x1052f2c0 3 [00 01 02]
       s: 0x1052f2c0 2 3 [00 01]
       s: 0x1052f2c0 3 3 [00 01 03]
       s: 0x1051a120 4 6 [00 01 03 04]
orgArray: 0x1052f2c0 3 [00 01 03]

答案 1 :(得分:2)

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.

答案 2 :(得分:1)

s := orgArray[:2]

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

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

如果你想知道为什么容量是6,那是因为容量增加2的功率。所以如果你有一个容量为4的片并附加5个元素,容量将变为8.这与尝试重新分配切片的内存,通常在附加时发生。