slice内存分析以及扩容
切片slice:
- 每一个切片引用了一个底层数组
- 切片本身不存储任何数据,都是底层数组存储,所以修改切片也就是修改这个数组中的数据
- 当向切片中添加数据时,如果没有超过容量,直接添加,如果超过容量。自动扩容(成倍增长)
- 当切片一旦扩容,就是重新指向一个新的底层数组
package main
import "fmt"
func main() {
s1:=[]int{1,2,3}
fmt.Println(s1)
fmt.Printf("长度为:%d,容量为%d\n",len(s1),cap(s1))
fmt.Printf("%p\n",s1)
s1=append(s1,4,5)
fmt.Println(s1)
fmt.Printf("长度为:%d,容量为%d\n",len(s1),cap(s1))
fmt.Printf("%p\n",s1)
s1=append(s1,6,7,8)
fmt.Println(s1)
fmt.Printf("长度为:%d,容量为%d\n",len(s1),cap(s1))
fmt.Printf("%p\n",s1)
s1=append(s1,9,10)
fmt.Println(s1)
fmt.Printf("长度为:%d,容量为%d\n",len(s1),cap(s1))
fmt.Printf("%p\n",s1)
s1=append(s1,11,12,13,14,15)
fmt.Println(s1)
fmt.Printf("长度为:%d,容量为%d\n",len(s1),cap(s1))
fmt.Printf("%p\n",s1)
}
在已有的数组上创建切片
slice:=arr[start:end]
切片中的数据:[start,end]
arr[:end]从头到尾
arr[start:]从start到末尾
在已有的数组上,直接创建切片,该切片的底层数组就是当前数组。
长度是从start到end切割的数据量。
但是容量从start到数组的末尾
package main
import "fmt"
func main() {
a:=[10]int{1,2,3,4,5,6,7,8,9,10}
fmt.Println("1.从已有的数组直接创建切片")
s1:=a[:5]
s2:=a[3:8]
s3:=a[5:]
s4:=a[:]
fmt.Println("a",a)
fmt.Println("s1",s1)
fmt.Println("s2",s2)
fmt.Println("s3",s3)
fmt.Println("s4",s4)
fmt.Printf("%p\n",&a)
fmt.Printf("%p\n",s1)
fmt.Println("2.长度和容量")
fmt.Printf("s1 len:%d,cap:%d\n",len(s1),cap(s1))
fmt.Printf("s2 len:%d,cap:%d\n",len(s2),cap(s2))
fmt.Printf("s3 len:%d,cap:%d\n",len(s3),cap(s3))
fmt.Printf("s4 len:%d,cap:%d\n",len(s4),cap(s4))
fmt.Println("3.更改数组的内容")
a[4]=100
fmt.Println("a",a)
fmt.Println("s1",s1)
fmt.Println("s2",s2)
fmt.Println("s3",s3)
fmt.Println("s4",s4)
fmt.Println("4.更改切片的内容")
s1=append(s1,1,1)
fmt.Println("a",a)
fmt.Println("s1",s1)
fmt.Println("s2",s2)
fmt.Println("s3",s3)
fmt.Println("s4",s4)
fmt.Println("5.添加元素切片扩容")
s1=append(s1,2,2,2,2,2,)
fmt.Println("a",a)
fmt.Println("s1",s1)
fmt.Println("s2",s2)
fmt.Println("s3",s3)
fmt.Println("s4",s4)
fmt.Println(len(s1),cap(s1))
fmt.Printf("%p\n",s1)
fmt.Printf("%p",&a)
}