包括三部分,数据指针指向原始数组地址,len记录长度,cap记录容量
var s []int
var s []int
fmt.Printf("cap=%v,len=%v,value=%v,s addr=%p,s=%p", cap(s), len(s), s,&s,s)
输出:
cap=0,len=0,value=[],s addr=0xc0003ca4b0,s=0x0
结论:
cap=len=0,s==nil,未分配底层数组
s := []int{1,2,3}
s := []int{1,2,3}
fmt.Printf("cap=%v,len=%v,value=%v,s addr=%p,s=%p", cap(s), len(s), s,&s,s)
输出:
cap=3,len=3,value=[1 2 3],s addr=0xc000004498,s=0xc000354ab0
结论:
cap=len=初始化的长度,s != nil,分配底层数组
s := make([]int, 2, 3)
s := make([]int, 2, 3)
fmt.Printf("cap=%v,len=%v,value=%v,s addr=%p,s=%p", cap(s), len(s), s,&s,s)
输出:
cap=3,len=2,value=[0 0],s addr=0xc0000044f8,s=0xc000354ab1
结论:
使用make初始化会将切片数组初始化为对应类型空值,len和cap为make指定值,未填cap的情况cap=len,s!=nil,分配底层数组,长度、容量为0也会分配
array := [10]int{0,1,2,3,4,5,6,7,8,9}
s1 := array[1:5]
s2 := array[5:]
s1、s2底层数组相同,起始地址不同
len(s1) = 4, cap(s1) = 9
len(s2) = 5, cap(s2) = 5
// s1、s2底层数组相同,修改共用的数组元素都受影响
// s1扩容、修改
s1 = append(s1, 99)
fmt.Printf("s1[4]=%v, s2[0]=%v,array[5]=%v", s1[4], s2[0], array[5])
fmt.Println()
// s2修改
s2[0] = 88
fmt.Printf("s1[4]=%v, s2[0]=%v,array[5]=%v", s1[4], s2[0], array[5])
fmt.Println()
// 修改底层数组
array[5] = 77
fmt.Printf("s1[4]=%v, s2[0]=%v,array[5]=%v", s1[4], s2[0], array[5])
fmt.Println()
// s2扩容,重新分配底层数组
s2 = append(s2, 999)
s1[4] = 66
fmt.Printf("s1[4]=%v, s2[0]=%v,array[5]=%v", s1[4], s2[0], array[5])
fmt.Println()
array[5] = 55
fmt.Printf("s1[4]=%v, s2[0]=%v,array[5]=%v", s1[4], s2[0], array[5])
fmt.Println()
s2[0] = 44
fmt.Printf("s1[4]=%v, s2[0]=%v,array[5]=%v", s1[4], s2[0], array[5])
fmt.Println()
输出:
s1[4]=99, s2[0]=99,array[5]=99
s1[4]=88, s2[0]=88,array[5]=88
s1[4]=77, s2[0]=77,array[5]=77
s1[4]=66, s2[0]=77,array[5]=66
s1[4]=55, s2[0]=77,array[5]=55
s1[4]=55, s2[0]=44,array[5]=55
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。