数组是内存连续存储的抽象,但是因为数组连续存储是需要指明大小的,并且一旦指明就不可以修改,因此各大语言都有内置的动态数组结构,如Java中的ArrayList,C++中的Vector,而在Go语言,可以使用切片来完成该功能,只不过切片的功能更为丰富和强大,切片可以建立在已经创建好的数组上,作为原来数组的一个视图,操作切片同步操作数组,同时也可以作为完全崭新的容器,依赖make/new方法去创建,纯粹的当作动态数组来使用。下面从切片的数据结构,创建方式,扩容策略来描述切片。

由于数组是固定长度的,因此,同C一样,在不明确指出内容的时候需要指明长度,明确指出内容的时候可以忽略长度,两种写法如下

arr1:=[3]int{}arr2:=[...]int{1,2,3} //自动填充3

简单的写法可以扩展到多维数组

arr1:=[3][5]int{}arr2:=[...][2]int{{1,2},{3,4}}

使用方法与其他语言基本一致。

不同于数组,切片属于组合类型,在定义的时候不需要指明长度,其结构主要包含三部分信息:对应底层数组的地址,当前使用的长度,容量。如下图所示:

如果我们使用现有的数组来创建切片的话,那么就是这个样子的

arr:=[]int{1,2,3,4,5}slice:=arr[:]

如果使用new来创建一个新的切片的话,需要注意指向真实数组地址的指针是nil

slice:=new([]int) //len = 0 ,cap = 0append(slice,1)//使用append进行扩容,会创建数组并且修改指针

使用make的话,是融合了1.new操作2.内存分配 3.初始化过程,可以指明len和cap,其中cap指明分配数组的大小,len表示多少被初始化。

slice:=make([]int,0,5)//如果非要指明len非0,slice1:=make([]int,1,5)

以上也说明了new操作与make操作的区别。

下面代码描述了slice操作已存在数组的过程,显然,如果建立在已经有的数组之上的切片,操作会同步,但是之后扩了容,很明显就不行了

  //1. 创建容量为5的整数类型数组  ints:= [5]int{}  //2. 根据数组创建slice  slice1:=ints[0:2]  slice2:=ints[2:5]  //3. 扩容前,内存地址一样,对slice的操作会反映到数组上  slice1[1] = 1  //4. 扩容之后由于内存地址都不一样了,因此自然对slice的修改作用不到原来的数组上了  slice3:=append(slice2,8)  slice3[0] = 2

下面描述下Go语言切片的扩容过程:

(图片截取自B站 eggo-tech 视频)

goland创建一个不限长度的字节切片_Go语言3 : 切片相关推荐

  1. goland创建一个不限长度的字节切片_Go语言入门必知教程-切片

    切片是一种灵活的和可扩展的数据结构,用于实现和管理数据集.切片由多个元素组成,所有元素都是相同类型的.切片是动态数组的一部分,可以根据需要进行增长和收缩.与数组一样,切片也可以索引.切片具有容量和长度 ...

  2. goland创建一个不限长度的字节切片_关于Go切片,看这篇就够了

    01.切片的内部实现和基础功能 切片是围绕着动态数组的概念来构建的,它跟数组类似,是用于管理数据集合的一种数据结构. 数组一旦创建就不能更改其长度和类型,而切片就不同,切片可以按需自动增长和缩小,增长 ...

  3. 函数使用了堆栈的字节超过_Go语言复习笔记——基本语法三之堆栈与字符串应用...

    堆栈与变量逃逸 栈 概念 栈是一张拥有特殊规则的线性表数据结构 栈只允许往线性表的一端放入数据,之后再这一端取出数据,数据遵循后进先出(LIFO)的顺序. 栈和变量的关系 栈的分配和回收非常快,在函数 ...

  4. 如何创建一个不确定长度的数组

    int size;//size表示数组长度 size=<表达式>://给size赋值 int * p=new int [size];//要定义不确定长度数组,必须动态分配,此处以定义int ...

  5. CMU创建一个开源的AI代码生成模型,C语言表现优于Codex

    来源:机器之心 本文约2400字,建议阅读5分钟 CMU 对现有开源和未开源的 AI 代码生成模型进行了全面深入的系统性评估,并分析了它们在 C.C++.Python 等 12 中不同编程语言中的代码 ...

  6. 创建一个长度为30的数组,每五个一组求平均数

    适合刚刚学前端的小伙伴,简单易懂,欢迎大家留言,一起交流 1. 按照要求创建一个数组 - 数组长度为 30 - 里面的数据是从 2 开始依次的所有 偶数 - 例如结果: arr = [ 2, 4, 6 ...

  7. C语言创建一个节点Node(附完整源码)

    C语言创建一个节点Node 节点结构体定义 C语言创建一个节点Node完整源码 节点结构体定义 struct node {struct node *leftNode;int data;struct n ...

  8. android mkdirs 不起作用,Android mkdirs()创建一个零字节文件而不是文件夹

    在我的 Android应用程序中,我试图在SD卡上创建以下文件夹: /mnt/sdcard/OSGiComponents/admin/felix-cache/ 这是代码: File cacheDir ...

  9. java创建一个未知长度的数组_Java数组的创建操作

    数组是一个固定长度的,包含了相同类型数据的 容器 步骤1:声明数组步骤2:创建数组步骤3:访问数组步骤4:数组长度步骤5:练习-数组最小值步骤6:答案-数组最小值 步骤 1 : 声明数组 int[] ...

最新文章

  1. Sharding-eth
  2. grape动态PHP结构(三)——API接口
  3. 类库探源——System.Exception
  4. csc.exe的环境变量设置
  5. pom.xml详细说明
  6. ZigBee网络数据传递流程_蓝牙、Wifi与ZigBee三种,这三种无线传输技术,谁能一统天下...
  7. c语言 函数的参数传递示例_C语言中带有示例的remove()函数
  8. C++ 面向对象 一
  9. 数据结构之线性表代码实现顺序存储,链式存储,静态链表(选自大话数据结构)...
  10. ZZULIOJ1035
  11. 详细游戏建模,入门要领及学习方法。
  12. 靶机渗透之Typhoon实战
  13. 1082 射击比赛(JAVA)
  14. 栈的压入、弹出序列和栈所有可能的弹出顺序
  15. 函数极限什么时候可以拆分
  16. 安富莱C语言编码规范
  17. 移动小额支付业务系统几种常用实现方式的分析和比较
  18. 如何长时间坚持一件事情
  19. 从PCB的结构与工艺理解阻焊(Solder mask)与助焊(Paster Mask)
  20. 从物联网架构分析物联网安全风险

热门文章

  1. 三、索引优化(4)索引碎片
  2. 通过Redis的Pub/Sub实现对服务器群的监控管理
  3. 自由动力论坛一枝花,全靠汇道童鞋来当家
  4. 在ListView控件中绘底图
  5. oracle的clob字段导致线上应用无响应问题及解决
  6. 水题总结NYOJ74,1094,60,975,111,833
  7. url、href、src
  8. 区域风云企业之大立-DVR产品的新技术应用
  9. MySQL Fabric集群功能整理---择录官网
  10. 锁屏面试题百日百刷-VUE篇(一)