3个月前 0 0 60
Go 的切片很强大,一般用到切片的地方就不会用到数组了,所以今天就来测试一下关于切片的引用,容量的等等
// 定义一个长度为3, 容量为9的切片
s := make([]string, 3, 9)
// 初始化元素到 s 里面
copy(s, []string{"a", "b", "c"})
网上资料的都说了切片是对底层数组的引用,那么对于追加之后超过的切片容量的呢?会怎么处理呢。首先看一下为超过容量。
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]
结果是不一致,的确是对底层数组的引用
在来看一个例子
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
版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
暂无评论~