【golang】leetcode专项训练-数组与切片

概念 在golang中,数组和切片是两个概念
数组
数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。
可以使用len()函数获取数组的长度
切片
因为数组的长度是固定的,因此在Go语言中很少直接使用数组。和数组对应的类型是Slice(切片),它是可以增长和收缩的动态序列,slice功能也更灵活。
除了长度,切片多了容量属性,可以通过使用内置的 len()函数求长度,使用内置的cap()函数求容量。
相同
都可以直接通过下标的方式访问元素
区别
初始化 数组

a := [3]int{1,2,3} //指定长度 //or a := [...]int{1,2,3} //不指定长度 //or a := [...]int{99: -1}//指定初始化,只有最后一个元素初始化为-1,其余为0

数组可以拓展到多维数组
// 声明一个二维整型数组,两个维度的长度分别是 4 和 2 var array [4][2]int // 使用数组字面量来声明并初始化一个二维整型数组 array = [4][2]int{{10, 11}, {20, 21}, {30, 31}, {40, 41}} // 声明并初始化数组中索引为 1 和 3 的元素 array = [4][2]int{1: {20, 21}, 3: {40, 41}} // 声明并初始化数组中指定的元素 array = [4][2]int{1: {0: 20}, 3: {1: 41}}

切片
s := make([]int) //创建一个长度为0,容量为0的切片 s := make([]int, 3, 5)//指定长度和容量 //or s := []int{1,2,3} //不指定长度

切片同样可以拓展到多维切片
//声明一个二维切片 var slice [][]int //为二维切片赋值 slice = [][]int{{10}, {100, 200}}

添加元素 虽然数组在初始化时也可以不指定长度,但 Go 语言会根据数组中元素个数自动设置数组长度,并且不可改变。
切片更像是一个动态的数组,可以通过 append 方法增加元素:
s := []int{1,2,3} //s = {1,2,3} s = append(s, 4) //s = {1,2,3,4} //添加多个元素 s = append(s, 1, 2, 3) // 追加多个元素, 手写解包方式 s = append(s, []int{1,2,3}...) // 追加一个切片, 切片需要解包

如果将 append 用在数组上,你将会收到报错:first argument to append must be slice。
复制 数组
在Go语言中,数组变量代表的是整个数组
所以在Go语言中,当数组变量B被赋值数组变量A时,实际上是数组变量B完全复制了一份数组A数据,而不是数组变量A和数组变量B指向同一份数据。
切片
Go语言的内置函数 copy() 可以将一个数组切片复制到另一个数组切片中,如果加入的两个数组切片不一样大,就会按照其中较小的那个数组切片的元素个数进行复制。
copy(slice2, slice1) // 复制slice1到slice2中

其中slice2, slice1指向同一个数组
详见https://segmentfault.com/a/11...
函数传递 【【golang】leetcode专项训练-数组与切片】当切片和数组作为参数在函数(func)中传递时,数组传递的是值,而切片传递的是指针。因此当传入的切片在函数中被改变时,函数外的切片也会同时改变。相同的情况,函数外的数组则不会发生任何变化。

    推荐阅读