go 切片探索

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许可证)

评论 (0)

    暂无评论~

njphper@copyright From 2014 to 2019-02-17