前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >golang 切片

golang 切片

原创
作者头像
Arata
修改2022-10-19 14:47:13
6720
修改2022-10-19 14:47:13
举报
文章被收录于专栏:自我提升

底层原理

包括三部分,数据指针指向原始数组地址,len记录长度,cap记录容量

初始化

var初始化

var s []int

代码语言:txt
复制
var s []int
fmt.Printf("cap=%v,len=%v,value=%v,s addr=%p,s=%p", cap(s), len(s), s,&s,s)

输出:

代码语言:txt
复制
cap=0,len=0,value=[],s addr=0xc0003ca4b0,s=0x0

结论:

cap=len=0,s==nil,未分配底层数组

直接赋值初始化

s := []int{1,2,3}

代码语言:txt
复制
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)

输出:

代码语言:txt
复制
cap=3,len=3,value=[1 2 3],s addr=0xc000004498,s=0xc000354ab0

结论:

cap=len=初始化的长度,s != nil,分配底层数组

make初始化

s := make([]int, 2, 3)

代码语言:txt
复制
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)

输出:

代码语言:txt
复制
cap=3,len=2,value=[0 0],s addr=0xc0000044f8,s=0xc000354ab1

结论:

使用make初始化会将切片数组初始化为对应类型空值,len和cap为make指定值,未填cap的情况cap=len,s!=nil,分配底层数组,长度、容量为0也会分配

扩容

截屏2022-10-18 21.55.10.png
截屏2022-10-18 21.55.10.png

共用内存

代码语言:txt
复制
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

代码语言:txt
复制
// 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()

输出:

代码语言:txt
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 底层原理
  • 初始化
    • var初始化
      • 直接赋值初始化
        • make初始化
        • 扩容
        • 共用内存
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档