Golang学习笔记(七):Slice

https://juejin.im/post/5c84fea66fb9a049ef2766f4

Slice,也叫切片,是一种存储特定类型的不定长序列,与数组相似,所不同的是,数组是定长的,而切片可以动态扩展,因此比数组灵活很多,一般使用[]T表示一个切片,其中的T表示类型。

另外,数组是值类型,在传给函数时,会复制一个数组的副本,当数组很大的时候,会消耗很多内存,而切片是引用类型,赋给函数,也只是复制切片的内存地址而已。

切片的定义与使用

一个切片,由三个部分构成,底层数组、长度(len)、容量(cap),每个切片都对应一个底层数组,而多个切片之间,也可共享一个底层数组,切片提供了一个访问底层数组的功能,长度小于容量,容量可以动态改变,因此可以认为切片是一个动态数组。

切片创建

字面量

声明一个切片,最简单的就像声明数组一样,直接使用字面量赋值,这时候切片的长度等于容量,如下代码所示。

  1. var s = []int{1,2,3,4}//len=4,cap=4

从一个数组创建切片

下面的例子中,我们先创建一个数组表示周一到周日,可以使得s[i:j]的方式,从一个数组或切片中创建另一个切片,这时候长度是当前切片元素的个数,而容量是则切片第一个元素到数组的最后一个元素的长度,而该数组则是切片对应的底层数组。

除了s[i:j]外,如果从数组的索引0开始,可以写为s[:j],如果是到数组的最后个元素,可以写为s[i:],如果包含整个数组,则可以写为s[:]。

  1. var week = [8]string{1:"Monday",2:"Tuesday",3:"Wednesday",4:"Thursday",5:"Friday",6:"Saturday",7:"Sunday"}
  2. w := week[1:8]//相当于 w := week[1:]

使用make函数创建切片

当我们直接定义一个切片时,如果没有使用字面量赋值初始化,由于切片是引用类型,因此切片的初始值为nil,这时候使用切片会报错,这时候可以使用Go语言内置函数make,为切片初始化。

  1. var s []int
  2. s[0] = 100//没有初始化,报错
  3. s = make([]int,5) //初始化一个长度为5的切片
  4. s[0] = 100 //s的元素为[100,0,0,0]
  5. fmt.Println(len(s),cap(s))//5,5
  6. //make()可以传第三个参数,表示切片的容量,上面例子没有传入容量,则容量与长度相等
  7. s = make([]int,5,10)//初始化一个长度为5,容量为10的切片

注意,切片为nil与空切片并不同相,虽然长度均为0,但空切片并不为nil

  1. var s []int
  2. var ss = []int{}
  3. fmt.Println(len(s),len(ss))//0,0
  4. fmt.Println(s == nil) //true
  5. fmt.Println(ss == nil)//false

长度与容量计算

切片的长度可以像数组一样,使用内置函数len()计算,而容量而使用内置函数cap()函数计算

  1. package main
  2. import "fmt"
  3. func main() {
  4. a := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
  5. s := a[1:3]
  6. fmt.Println(len(s)) //2
  7. fmt.Println(cap(s)) //9
  8. }
ft_authoradmin  ft_create_time2019-08-03 17:05
 ft_update_time2019-08-03 17:05