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]