【golang】数组和切片

本文探讨了Golang中的数组和切片。数组在Golang中是不可变的,而切片则是一个可变长度的序列,基于数组并提供了一种灵活的方式去访问数组部分。切片包含长度、容量和指针属性,它们可以作为指向数组某个区域的引用。通过示例展示了切片的创建、使用和修改,以及如何通过`append`方法动态扩展切片容量。同时,文章指出切片不能作为map的键,因为切片无法直接比较。
摘要由CSDN通过智能技术生成

【golang】数组和切片

在golang中,有一个“罕见”的复合类型,叫切片,切片是基于数组的,golang和其它语言不一样,在golang中,数组是不可变的,对数组进行类型转换等操作都会导致golang隐式的申请一块内存,然后将原数组的内容复制到这块内存。

数组是不可变的,这就决定了字符串也是不可变的,因为字符串底层就是一个byte数组实现的。

在实际的开发当中,我们经常使用的是切片,而不是数组。

切片

切片是基于数组的,它表示一个拥有相同类型元素的可变长度的序列

切片是一种轻量级的数据结构,可以用来访问数组的部分或者全部的元素,emmmmm,可以把它看作一个指向数组的某块区域的引用,这块区域可以是数组的部分,也可以是数组的全部。

切片包含长度,容量,指针三个属性,指针指向的是数组的某块区域,容量一般是数组的长度,而长度指的是切片开始的位置到切片结束的位置的长度,而容量是指切片开始的位置到数组结束的位置,看得出来,切片是依赖于数组的

假设现在有这样一个整型数组

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

这里写图片描述

现在创建一个基于该数组的切片

slice := arr[0:3]

这里写图片描述

现在的slice的指针指向的就是arr的第一个元素,而它的长度是3,容量是整个数组的长度5

现在来看一下切片的实际应用

比如有时候我们想要频繁的修改一个数组的元素,那么我们从一开始就可以创建一个切片

比如创建一个1, 2, 3, 4, 5的整型的切片

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

fmt.Println(slice) //1 0 3 4 5

这段切片的声明只比上面的数组声明少

Golang数组切片是两种不同的数据类型,用于存储相同数据类型的容器。数组的长度是固定的,而切片的长度是可变的。在日常应用中,切片的使用更为普遍。 数组在声明时需要指定长度,并且在初始化时必须提供相同长度的元素。例如,`a := int{1, 2, 3}`就是一个长度为3的整数数组数组的长度一旦确定后就不能更改。 切片是基于数组的引用类型。它不需要指定固定的长度,并且可以根据需要动态扩展或缩小。切片包装着底层数组,通过指定起始索引和结束索引来指定子集。例如,`b := a[:]`就是一个切片,它包含了数组a的所有元素。 数组适用于需要固定长度的场景,而切片适用于长度可变的情况。在实际应用中,切片更常用,因为它提供了更大的灵活性和便利性。 总结: - 数组是长度固定的容器,切片是长度可变的容器; - 数组在声明时需要指定长度,切片则不需要; - 数组的长度一旦确定后就不能更改,而切片可以根据需要动态扩展或缩小; - 切片是基于数组的引用类型,可以通过指定起始索引和结束索引来指定子集。 参考资料: Golang中的「数组」和「切片」都是存储同一数据类型的容器,只不过Golang中的数组长度是固定的,而切片的长度是可变化的。 切片是引用类型,切片包装的数组称为该切片的底层数组。我们来看一段代码://a是一个数组,注意数组是一个固定长度的,初始化时候必须要指定长度,不指定长度的话就是切片了 a := int{1, 2, 3} //b是数组,是a...。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值