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

Ale*_*hew 1 go

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

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

我的切片在哪里'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
Run Code Online (Sandbox Code Playgroud)

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

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

pet*_*rSO 5

Go编程语言规范

附加和复制切片

如果s的容量不足以容纳附加值,则追加分配一个新的,足够大的底层数组,该数组既适合现有切片元素又适合其他值.否则,追加重新使用底层数组.

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

数组,切片(和字符串):'追加'的机制

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

append 复杂

例如,

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)
}
Run Code Online (Sandbox Code Playgroud)

输出:

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]
Run Code Online (Sandbox Code Playgroud)