golang slice
先看一个简单的代码块
package main
import (
"fmt"
)
func main() {
//case 1
a := []int{}
a = append(a, 1)
a = append(a, 2)
b := append(a, 3)
c := append(a, 4)
fmt.Println("a: ", a, "\nb: ", b, "\nc: ", c)
//case 2
a = append(a, 3)
x := append(a, 4)
y := append(a, 5)
fmt.Println("a: ", a, "\nx: ", x, "\ny: ", y)
}
输出的结果如下
a: [1 2]
b: [1 2 3]
c: [1 2 4]
a: [1 2 3]
x: [1 2 3 5]
y: [1 2 3 5]
其他的都是输出都是常规操作,可能很多人对这个x的输出感到诧异,为什么是1 2 3 5,而不是 1 2 3 4.这是因为,他们都是切片,切片底层公用一个数组。x和y都是指针,指向同一个底层数组。
当在操作b和c时候,由于超过了数组的slice的cap容量,会触发扩容操作,所以b和c分别指向了两个不同的新数组。而当x和y追加操作时,并未触发新数组创建,x和y指向同一个底层数组,所以在
x追加操作时,返回的任然是a的指针,len是4和a的容量4。
y追加操作时,返回的任然是a的指针,len是4和a的容量4。