Golang:数组和切片(slice)类型

快到碗里来_0004 · · 1126 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

数组

数组是有着类型相同的元素且长度固定的集合
数组的声明必须要指定类型和长度,且长度是无法改变的。声明时不赋值,数组会自动初始化数组类型的空值。

// 声明并赋值
a1 := [5]int{1,2,3,4,5} 
// 声明空整数数组
a2 := [5]int{} 

数组是值类型
通过格式化%p可以看出来如果不使用&符号是无法打印地址。

fmt.Printf("%p  ---- %p \n",a1,&a1)

输出结果为:
%!p([5]int=[1 2 3 4 5]) ---- 0xc00001a1e0

切片(slice)

切片是对数组一个连续片段的引用,所以切片是引用类型。切片在make初始化时长度和容量可以传入两个参数,第一参数长度(不为空),第二个参数是容量。
切片的长度声明效果和数组是一样,初始化切片声明类型的空值。
对切片长度追加可以使用append函数,当追加的切片长度超过容量,欺骗就会分配一个新的底层数组(指向地址会变)。在切片的容量小于 1000 个元素时,总是会成倍地增加容量。一旦元素个数超过 1000,容量的增长因子会设为 1.25,也就是会每次增加 25%的容量(随着语言的演化,这种增长算法可能会有所改变)。

    s1 := make([]int,0,4)
    for i := 0;i<10;i++  {
        s1 = append(s1,i)
        fmt.Printf("s1 元素:%v , 地址:%p  长度:%d 容量:%d\n ",s1,s1,len(s1),cap(s1))
    }

输出结果:
s1 元素:[0] , 地址:0xc000016120 长度:1 容量:4
s1 元素:[0 1] , 地址:0xc000016120 长度:2 容量:4
s1 元素:[0 1 2] , 地址:0xc000016120 长度:3 容量:4
s1 元素:[0 1 2 3] , 地址:0xc000016120 长度:4 容量:4
s1 元素:[0 1 2 3 4] , 地址:0xc00001c140 长度:5 容量:8
s1 元素:[0 1 2 3 4 5] , 地址:0xc00001c140 长度:6 容量:8
s1 元素:[0 1 2 3 4 5 6] , 地址:0xc00001c140 长度:7 容量:8
s1 元素:[0 1 2 3 4 5 6 7] , 地址:0xc00001c140 长度:8 容量:8
s1 元素:[0 1 2 3 4 5 6 7 8] , 地址:0xc00008a080 长度:9 容量:16
s1 元素:[0 1 2 3 4 5 6 7 8 9] , 地址:0xc00008a080 长度:10 容量:16


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:快到碗里来_0004

查看原文:Golang:数组和切片(slice)类型

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1126 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传