首页 > 其他分享 >数组 vs. 切片

数组 vs. 切片

时间:2023-11-03 10:56:45浏览次数:39  
标签:int 切片 vs 内存 数组 Go 长度

在Go编程语言中处理数据时,经常会遇到数组和切片。这两者是不同的数据结构,有各自的特性和用途。本文将对Go中的数组和切片进行比较,以帮助大家更好地理解它们。

1. 长度不同

一个主要的区别是长度。在Go中,数组是具有固定长度的数据结构,一旦创建,其大小不可更改。相比之下,切片具有动态大小,可以在运行时动态增长或缩小。

2. 声明方式

在声明时,数组需要指定其长度,例如:

var arr [5]int

而切片的声明不需要指定长度:

var slice []int

或者使用make函数初始化:

slice := make([]int, 5)

3. 内存管理

另一个重要的区别是内存管理。数组是值类型,它们在栈上分配内存,当复制数组时,将创建一个完全相同的数组副本。相比之下,切片是引用类型,它们引用底层数组的一部分数据,因此多个切片可以引用相同的底层数组。切片的赋值不会复制底层数组,而是共享同一数据。

4. 长度和容量

切片引入了长度和容量的概念。长度表示切片当前包含的元素数量,而容量表示切片底层数组的大小,即可以包含的元素数量。切片的容量可以大于或等于其长度。

5. 添加和删除元素

由于数组长度固定,不能直接添加或删除元素。必须创建一个新数组并复制元素,或者使用已有的数组。切片允许使用append函数向切片添加元素,它会自动管理切片的长度和容量。

6. 传递给函数

数组通常传递数组的副本给函数,这可能会导致内存和性能开销。相反,切片是引用传递,传递切片时,传递的是底层数组的引用,而不是整个数据的副本。这对于避免内存开销和支持动态大小非常有用。

7. 初始化

数组可以使用数组字面值来初始化:

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

切片可以使用切片字面值或make函数来初始化。

8. 使用场景

在具体使用上,数组通常用于具有固定大小的集合,需要确定大小和固定内存开销的情况。切片则通常用于需要动态大小、灵活性和内存效率的情况。切片是Go中广泛使用的数据结构,尤其在处理集合数据时非常有用。

综上,Go中的数组和切片在功能和用途上有明显的差异,开发者需要根据具体需求选择适当的数据结构。切片通常更灵活,因此在许多情况下更受欢迎。了解它们的区别和适用场景可以帮助你更好地利用它们。


孟斯特

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意


标签:int,切片,vs,内存,数组,Go,长度
From: https://www.cnblogs.com/lianshuiwuyi/p/17807106.html

相关文章

  • VS code 可以做什么?
    编写markdownVScode真的是非常好用的Markdown编写工具,我用他来编写Markdown的时间甚至比写代码还要多。比如,我每周写的公众号文章。相关插件:MarkdownMarkdownPreviewEnhancedMarkdownAllinOne编写python大多数同学写python选择pycharm,但他们经常会遇到很多问题,比如pychar......
  • [Linux] shell编程之数组 [转载]
    1概述数组是Shell的一种特殊变量,是一组数据的集合,里面的每个数据被称为一个数组元素。当前Bash仅支持一维索引数组和关联数组,Bash对数组的大小没有限制。2定义数组2.1一维索引数组方法1#定义一个空数组array=()#为数组元素赋值array1[0]=aarray1[1]=barray......
  • Playwright VS Selenium VS Puppeteer VS Cypress
    参考:https://www.testim.io/blog/puppeteer-selenium-playwright-cypress-how-to-choose/这四款自动化测试框架在我们的公众号都有介绍。上周介绍了新出Playwright,那这款工具有什么优点,是否值得我们投入精力学习。关键对比接下来,我会通过一些维度来进行对比。支持语言Playwright:......
  • HanLP — Aho-Corasick DoubleArrayTire 算法 ACDAT - 基于双数组字典树的AC自动机
    双数组字典树能在O(1)(1是模式串长度)时间内高速完成单串匹配,并且内存消耗可控,然而软肋在于多模式匹配。如果要匹配多个模式串,必须先实现前缀查询,然后频繁截取文本后缀才可多匹配。比如ushers、shers、hers…这样一份文本要回退扫描多遍,性能较低。既然AC自动机的goto表本身就是一......
  • 实现一个极简的字节数组对象池
    .NET利用ArrayPoolPool<T>和MemoryPool<T>提供了针对Array/Memory<T>的对象池功能。最近在一个项目中需要使用到针对字节数组的对象池,由于这些池化的字节数组相当庞大,我希望将它们分配到POH上以降低GC的压力。由于ArrayPoolPool<T>没法提供支持,所以我提供了一个极简的实现。目录一......
  • 实验3 类与数组、指针
    实验任务1Point.hpp源码1#pragmaonce23#include<iostream>4usingstd::cout;5usingstd::endl;67classPoint{8public:9Point(intx0=0,inty0=0);10~Point()=default;1112intget_x()const;13intget_y()c......
  • 代码随想训练营第二十三天(Python)| 669. 修剪二叉搜索树 、108.将有序数组转换为二叉搜
    669.修剪二叉搜索树树的修剪方式赋值。1、递归法classSolution:deftrimBST(self,root:Optional[TreeNode],low:int,high:int)->Optional[TreeNode]:ifrootisNone:returnNoneifroot.val<low:returnself.tr......
  • JavaScript 将大数组拆分成多个小数组 循环调用接口
    项目需求:数据列表批量选择提交购物车,一次性提交数据量过大接口会报错,传递的参数是选中数据id的数组。项目运行很久了不做大改动,将提交数据总数限制在2000条以内,每500条走一次接口。思路:1.写一个将大数组拆分多个小数组的方法,arr为大数组,len为要拆分的小数组长度arrGroup(arr,......
  • 数据类型-数组
    1.定宽数组:compile时确定intarry[5:0]  equivalentto  intarry[6]arry[5:0]=`{1,2,3,4,5,6};arry[5:0]=`{6{6}};arry[5:0]=`{1,2,3,default:4}=`{1,2,3,4,4,4} //=====================================================================2.动态数组:simu......
  • 今年秋招VS去年秋招!我滴娘啊
    金九银十一晃而过,如果是往年,那么大部分人应该已经满载而归了,然而今年的情况却截然不同。就拿去年西安财经大学的本科生为例,去年西财的同学沟通600家公司,大概已经面了30+公司了,Offer也已经拿了6-7个了,咱们先来看看吧。小米和完美世界实习去年西财的同学,拿到了知名公司的......