《Go题库·1》Golang里的数组和切片有了解过吗?

Go语言中,数组长度固定,切片长度可变。切片是对数组的封装,可视为数组的引用,长度和容量可通过len和cap获取。数组作为值类型在函数传递中复制,而切片作为引用类型传递会共享底层数组。切片可以通过append扩容,新切片可能指向新数组。数组和切片不能直接比较,切片拷贝会创建新对象,使用时需注意扩容的影响。
摘要由CSDN通过智能技术生成

题目来源: 深信服、知乎、跟谁学

题目解析: GOALNG ROADMAP社区

答案 1:(溪尾)

数组长度是固定的,而切片是可变长的。可以把切片看作是对底层数组的封装,每个切片的底层数据结构中,一定会包含一个数组。数组可以被称为切片的底层数组,切片也可以被看作对数组某一连续片段的引用。因此,Go 中切片属于引用类型,而数组属于值类型,通过内建函数 len,可以取得数组和切片的长度。通过内建函数 cap,可以得到数组和切片的容量。但是数组的长度和容量是相等的,并且都不可变,而且切片容量是有变化规律的。

答案 2:(行飞子)

数组和切片的关系:

切片一旦初始化, 切片始终与保存其元素的基础数组相关联。因此,切片会和与其拥有同一基础数组的其他切片共享存储 ; 相比之下,不同的数组总是代表不同的存储。

数组和切片的区别

  1. 切片的长度可能在执行期间发生变化 ,而数组的长度不能变化,可以把切片看成一个长度可变的数组。

  2. 数组作为函数参数是进行值传递的,函数内部改变传入的数组元素值不会影响函数外部数组的元素值; 切片作为函数的参数是进行的指针传递,函数内部改变切片的值会影响函数外部的切片元素值。

  3. 数组可以比较,切片不能比较(对底层数组的引用)。

答案 3:(栾龙生)

1. Go 切片和 Go 数组

Go 切片,又称动态数组,它实际是基于数组类型做的一层封装。

Go 数组

数组是内置(build-in)类型,是一组同类型数据的集合,它是值类型,通过从 0 开始的下标索引访问元素值。在初始化后长度是固定的,无法修改其长度。当作为方法的参数传入时将复制一份数组而不是引用同一指针。数组的长度也是其类型的一部分,通过内置函数 len(array)获取其长度。

Go 数组与像 C/C++等语言中数组略有不同,如下

  • Go 中的数组是值类型,换句话说,如果你将一个数组赋值给另外一个数组,那么,实际上就是将整个数组拷贝一份。因此,在 Go 中如果将数组作为函数的参数传递的话,那效率就肯定没有传递指针高了。
  • 数组的长度也是类型的一部分,这就说明[10]int[20]int不是同一种数据类型。

Go 切片

Go 语言中数组的长度是固定的,且不同长度的数组是不同类型,这样的限制带来不少局限性。

而切片则不同,切片(slice)是一个拥有相同类型元素的可变长序列,可以方便地进行扩容和传递,实际使用时比数组更加灵活,这也正是切片存在的意义。

切片是引用类型,因此在当传递切片时将引用同一指针,修改值将会影响其他的对象。

2. 切片底层

现在就来看一下 Go 语言切片的底层是什么样子吧!

Go 切片(slice)的实现可以在源码包src/runtime/slice.go中找到。在源码中,slice 的数据结构定义如下。

type slice struct {
    array unsafe.Pointer    //指向底层数组的指针
    len int                    //切片长度
    cap int                    //切片容量
}

可以看到,组成 Go 切片的三元组分别为指向底层数组的指针,切片长度和切片容量。

  1. 指向底层数组的指针

    前面已经提到,切片实际是对数组的一层封装。这个指针便是记录其底层数组的地址,也正是切片开始的位置。

  2. 切片长度

    len表示切片的长度,即切片中现存有效元素的个数,它不能超过切片的容量。可以通过len()函数获取切片长度。

  3. 切片容量

    cap表示切片的容量,即切片能存储元素的多少,通常是从切片的起始元素到底层数组的最后一个元素间的元素个数,当切片容量不足时,便会触发 slice 扩容。可以通过cap()函数获取切片容量。

下图展示了一个 Go 切片的底层数据结构,这个切片的长度为 3,容量为 6。

3. 切片使用

  1. 切片定义方式
   var a []int                    //nil切片,和nil相等,一般用来表示一个不存在的切片
   var b []int{}                //空切片,和nil不相等,一般用来表示一
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值