GO语言学习笔记(十一):GO语言中的切片(一)

分类:
GO
标签:
基础
学习笔记
作者:
何鑫
创作时间:
2019/10/18 10:34:04

摘要:动态‘数组’-切片

切片定义

切片,顾名思义,我们可以把它理解为从数组切出来的一条片段,它的底层就是数组,它有两个属性,长度和容量,长度是切片元素的数量,容量则是底层数组的长度。

我们先来定义一个切片。我们有三种方式来获得切片。

第一种,使用切片字面量。

slice  := []int{1, 2, 3, 4} // 使用字面量来定义切片

可以看到切片与数组定义十分相似,只不过少了长度,因为切片的长度并不确定。那么我们如何获得切片的长度和容量呢?使用GO语言内置函数len()和cap()即可!

func main() {
   
   slice  := []int{1, 2, 3, 4}

   fmt.Println("切片长度", len(slice))

   fmt.Println("切片容量", cap(slice))

}

 运行输出:

切片长度 4

切片容量 4

使用自变量定义的切片,长度和容量是一致的。

第二种:使用make函数。

slice := make([]int, 4, 5)

make函数接收三个参数,第一个参数为切片的类型,第二个参数为切片的长度,第三个为切片的容量,这里我们定义了一个int类型长度为4,容量为5的切片,使用make定义的切片内部会初始化为对应类型的零值,我们打印一下该切片来验证一下:

func main() {

   slice := make([]int, 4, 5)

   fmt.Println(slice)

}

获得结果:[0 0 0 0]

第三种,从数组中获得切片。

切片基于数组,我们当然也可以从数组中获得切片。

func main() {

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

   // 获得切片
   slice := array[1:3]
   
   fmt.Println(slice)

}

输出:[2 3]

我们来看一下这段程序,首先我们定义了一个数组array,该数组包含1,2,3,4,5,5个元素,数组长度为5,然后我们使用使用array[1:3]获取了一个切片,1和3是指源数组索引,表示我们要基于这个索引来获取切片,注意,获取的切片元素包含1索引位置的元素,不包含3索引位置的元素,所以我们获取到的切片就是[2 3],长度为2,容量为底层数组的长度。即5。我们也可以使用第三个参数来限制容量:

slice := array[1:3:4]

如上,我们增加了第三个参数来限制容量,容量为第三个数减去第一个数,即4-1=3,容量为3。


切片的增删改查

我们先初始化一个数组:

slice := make([]int, 5) // [0 0 0 0 0]

我们使用内置的append函数来增加元素

slice = append(slice, 6) // 增加元素6 [0 0 0 0 0 6]

我们也可以使用append拼接两个切片

slice2 := []int{7, 8}
slice = append(slice, slice2...) // 拼接新切片slice2 [0 0 0 0 0 6 7 8]

要从切片中删除元素,我们可以从切片中再切出不包含该元素的切片,然后进行组合即可。

例如在上例的基础上我们需要删除6这个元素,我们可以:

slice = append(slice[:5], slice[6:]...) // [0 0 0 0 0 7 8]

思路就是截取再合并!

和数组差不多,使用索引就可以修改元素了。

在上例基础上,我们修改倒数第三个元素为6:

slice[4] = 6 // [0 0 0 0 6 7 8]

和数组一样使用for或range循环即可,可参考数组,这里不再赘述。


发表评论

温馨提示: 评论先审核后发布, 请勿发表不良言论

所有评论