go语言中数组与切片有哪些区别(go语言,编程语言)

时间:2024-05-02 16:14:25 作者 : 石家庄SEO 分类 : 编程语言
  • TAG :

    go%E8%AF%AD%E8%A8%80%E4%B8%AD%E6%95%B0%E7%BB%84%E4%B8%8E%E5%88%87%E7%89%87%E6%9C%89%E5%93%AA%E4%BA%9B%E5%8C%BA%E5%88%AB

数组与切片的区别:1、切片是指针类型,数组是值类型;2、数组的赋值形式为值传递,切片的赋值形式为引用传递;3、数组的长度是固定的,而切片长度可以任意调整(切片是动态的数组);4、数组的长度是固定的,而切片长度可以任意调整(切片是动态的数组)。

undefined

Go语言中的数组大概相当与C/C++中的数组,固定大小,不能够动态扩展大小,而切片大概相当与C++中的Vector,可以动态扩展大小,当大小超过容量时,重新分配一块内存,然后将数据复制到新的内存区域。

Go的切片是在数组之上的抽象数据类型,因此在了解切片之前必须要先理解数组。

var identifier [len]type

var identifier = [len]type{value1, value2, … , valueN}

var identifier = […]type{value1, value2, … , valueN}

相对应的:

identifier := [len]type{}

identifier := [len]type{value1, value2, … , valueN}

identifier := […]type{value1, value2, … , valueN}

例子:

结果:

我们看数组 iarray1,只声明,并未赋值,Go语言帮我们自动赋值为0。再看 iarray2 和 iarray3 ,我们可以看到,Go语言的声明,可以表明类型,也可以不表明类型,var iarray3 = [5]int32{1, 2, 3, 4, 5} 也是完全没问题的。

数组的容量和长度是一样的。cap() 函数和 len() 函数均输出数组的容量(即长度)

数组是值类型,将一个数组赋值给另一个数组时,传递的是一份拷贝。而切片是引用类型,切片包装的数组称为该切片的底层数组。看下面的例子:

Go语言中,切片是长度可变、容量固定的相同的元素序列。Go语言的切片本质是一个数组。容量固定是因为数组的长度是固定的,切片的容量即隐藏数组的长度。长度可变指的是在数组长度的范围内可变。

var slice1 = make([]int,5,10)

var slice2 = make([]int,5)

var slice3 = []int{}

var slice4 = []int{1,2,3,4,5}

相对应的:

slice1 := make([]int,5,10)

slice2 := make([]int,5)

slice3 := []int{}

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

以上对应的输出

从3)、4)可见,创建切片跟创建数组唯一的区别在于 Type 前的“ [] ”中是否有数字,为空,则代表切片,否则则代表数组。因为切片是长度可变的

Go的切片是在数组之上的抽象数据类型,所以创建的切片始终都有一个数组存在。

举例说明:

输出:

也说明,切片slice0 、 slice1 和 slice2是同一个底层数组的引用,所以slice2改变了,其他两个都会变

内置函数append可以向一个切片后追加一个或多个同类型的其他值。如果追加的元素数量超过了原切片容量,那么最后返回的是一个全新数组中的全新切片。如果没有超过,那么最后返回的是原数组中的全新切片。无论如何,append对原切片无任何影响。

举例说明:

输出:

再看一个例子:

以上输出:

下面的主要看一些实际的例子来说明数组和切片的区别。

1、数组与切片的赋值形式

例子1

从这个例子中可以看出,数组的赋值是值的拷贝,是一个全新的数组。而切片的赋值是引用。下面再来看一个例子。

例子2:

这个例子再一次说明:数组是赋值是copy,而切片仅是引用。例子1和例子2中的切片的声明用到了隐藏数组。再来看下例子3,使用非隐藏数组的情况。

例子3:

综上三个例子,可以看出切片是数组的引用,这里包括对隐藏数组、非隐藏数组引用。

2、数组作为参数,被函数调用

从上面的例子可以看出,数组在参数中,可以使用值传递和引用传递。值传递会拷贝新数组,引用传递则使用原数组。

从这个例子中可以看出,切片在参数中传递本身就引用。

本文:go语言中数组与切片有哪些区别的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:go Realize怎么使用下一篇:

4 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18