goland创建一个不限长度的字节切片_Go语言3 : 切片
数组是内存连续存储的抽象,但是因为数组连续存储是需要指明大小的,并且一旦指明就不可以修改,因此各大语言都有内置的动态数组结构,如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 : 切片相关推荐
- goland创建一个不限长度的字节切片_Go语言入门必知教程-切片
切片是一种灵活的和可扩展的数据结构,用于实现和管理数据集.切片由多个元素组成,所有元素都是相同类型的.切片是动态数组的一部分,可以根据需要进行增长和收缩.与数组一样,切片也可以索引.切片具有容量和长度 ...
- goland创建一个不限长度的字节切片_关于Go切片,看这篇就够了
01.切片的内部实现和基础功能 切片是围绕着动态数组的概念来构建的,它跟数组类似,是用于管理数据集合的一种数据结构. 数组一旦创建就不能更改其长度和类型,而切片就不同,切片可以按需自动增长和缩小,增长 ...
- 函数使用了堆栈的字节超过_Go语言复习笔记——基本语法三之堆栈与字符串应用...
堆栈与变量逃逸 栈 概念 栈是一张拥有特殊规则的线性表数据结构 栈只允许往线性表的一端放入数据,之后再这一端取出数据,数据遵循后进先出(LIFO)的顺序. 栈和变量的关系 栈的分配和回收非常快,在函数 ...
- 如何创建一个不确定长度的数组
int size;//size表示数组长度 size=<表达式>://给size赋值 int * p=new int [size];//要定义不确定长度数组,必须动态分配,此处以定义int ...
- CMU创建一个开源的AI代码生成模型,C语言表现优于Codex
来源:机器之心 本文约2400字,建议阅读5分钟 CMU 对现有开源和未开源的 AI 代码生成模型进行了全面深入的系统性评估,并分析了它们在 C.C++.Python 等 12 中不同编程语言中的代码 ...
- 创建一个长度为30的数组,每五个一组求平均数
适合刚刚学前端的小伙伴,简单易懂,欢迎大家留言,一起交流 1. 按照要求创建一个数组 - 数组长度为 30 - 里面的数据是从 2 开始依次的所有 偶数 - 例如结果: arr = [ 2, 4, 6 ...
- C语言创建一个节点Node(附完整源码)
C语言创建一个节点Node 节点结构体定义 C语言创建一个节点Node完整源码 节点结构体定义 struct node {struct node *leftNode;int data;struct n ...
- android mkdirs 不起作用,Android mkdirs()创建一个零字节文件而不是文件夹
在我的 Android应用程序中,我试图在SD卡上创建以下文件夹: /mnt/sdcard/OSGiComponents/admin/felix-cache/ 这是代码: File cacheDir ...
- java创建一个未知长度的数组_Java数组的创建操作
数组是一个固定长度的,包含了相同类型数据的 容器 步骤1:声明数组步骤2:创建数组步骤3:访问数组步骤4:数组长度步骤5:练习-数组最小值步骤6:答案-数组最小值 步骤 1 : 声明数组 int[] ...
最新文章
- Sharding-eth
- grape动态PHP结构(三)——API接口
- 类库探源——System.Exception
- csc.exe的环境变量设置
- pom.xml详细说明
- ZigBee网络数据传递流程_蓝牙、Wifi与ZigBee三种,这三种无线传输技术,谁能一统天下...
- c语言 函数的参数传递示例_C语言中带有示例的remove()函数
- C++ 面向对象 一
- 数据结构之线性表代码实现顺序存储,链式存储,静态链表(选自大话数据结构)...
- ZZULIOJ1035
- 详细游戏建模,入门要领及学习方法。
- 靶机渗透之Typhoon实战
- 1082 射击比赛(JAVA)
- 栈的压入、弹出序列和栈所有可能的弹出顺序
- 函数极限什么时候可以拆分
- 安富莱C语言编码规范
- 移动小额支付业务系统几种常用实现方式的分析和比较
- 如何长时间坚持一件事情
- 从PCB的结构与工艺理解阻焊(Solder mask)与助焊(Paster Mask)
- 从物联网架构分析物联网安全风险