数组:在golang中数组对应底层就是一段连续的内存空间。由于无法拓展等特性,在实际开发中应用的场景比较少。
切片:比数组更加灵活的一种数据结构。可拓展。切片的底层其实就是一段数组。
切片的本质:1.Ta就是一个框,框住了一段连续内存。
2.Ta是ptr类型。Tad对应的数据都存放在了底层数组中。
3.一个nil的切片没有底层数组。nil的切片的长度和容量均为0。但是长度和容量为0的切片并不一定是空切片。===>如果判断一个切片是不是空切片 要 == nil去判定。
4.切片的扩容。
上面第三点
var a1 []int //这里 = nil
a1 := []int{} //!=nil
a1 := make([]int,0,0) //!=nil
也就是Ta有没有开辟内存空间。https://www.cndba.cn/Supreme_Aaron/article/4037https://www.cndba.cn/Supreme_Aaron/article/4037https://www.cndba.cn/Supreme_Aaron/article/4037
https://www.cndba.cn/Supreme_Aaron/article/4037https://www.cndba.cn/Supreme_Aaron/article/4037
会发现数组都变了。
验证了 slice是prt类型,Ta对应的ptr还是一样。证明是同一个。,它内部并没有存数据。
原先是1 3 5 变成了1 5 5 。由于他只能是一段连续的内存,1 3 5 无法连续. https://www.cndba.cn/Supreme_Aaron/article/4037
关于切片扩容的问题。可以看golang源码的runtime.slice文件。里面针对不同情况做了 判断。
大概就是如果扩容的大小 大于当前的两倍就使用扩容的大小。
然后在根据1024 来判断。小于1024就 直接翻倍。
大于1024 25%增加。https://www.cndba.cn/Supreme_Aaron/article/4037
版权声明:本文为博主原创文章,未经博主允许不得转载。