go 切片探索

切片

Go 的切片很强大,一般用到切片的地方就不会用到数组了,所以今天就来测试一下关于切片的引用,容量的等等

1
2
// 定义一个长度为3, 容量为9的切片 
s := make([]string, 3, 9)
1
2
// 初始化元素到 s 里面
copy(s, []string{"a", "b", "c"})

网上资料的都说了切片是对底层数组的引用,那么对于追加之后超过的切片容量的呢?会怎么处理呢。首先看一下为超过容量。

1
2
3
4
5
6
d := []string{"d", "e", "f"}
s1 := append(s, d...)
fmt.Println(s1)
s[0] = "z"
fmt.Println(cap(s1))
fmt.Println(s1)

创建一个 d 切片
然后将 d 追加到 s 中并返回给一个 s1
打印 s1 => [a b c d e f]
改变 s 第一个元素
打印查看 s1 cap 的大小为 9
打印 s1 => [z b c d e f]
结果是不一致,的确是对底层数组的引用

在来看一个例子

1
2
3
4
5
6
d := []string{"d", "e", "f", "d", "e", "f", "d", "e", "f"}
s1 := append(s, d...)
fmt.Println(s1)
s[0] = "z"
fmt.Println(cap(s1))
fmt.Println(s1)

创建一个 d 切片
然后将 d 追加到 s 中并返回给一个 s1
打印 s1 => [a b c d e f d e f d e f]
改变 s 第一个元素
打印查看 s1 cap 的大小为 18
打印 s1 => [a b c d e f d e f d e f]
结果是一致,说明没有对 s 底层的数组进行引用了,而是开辟了新的 slice