Golang学习笔记(七):Slice

·  阅读 283

原创作者,公众号【程序员读书】,欢迎关注公众号,转载文章请注明出处哦。

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

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

切片的定义与使用

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

切片创建

字面量

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

var s = []int{1,2,3,4}//len=4,cap=4
复制代码

从一个数组创建切片

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

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

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

w := week[1:8]//相当于 w := week[1:]

复制代码

使用make函数创建切片

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

var s []int

s[0] = 100//没有初始化,报错

s = make([]int,5) //初始化一个长度为5的切片

s[0] = 100 //s的元素为[100,0,0,0]

fmt.Println(len(s),cap(s))//5,5

//make()可以传第三个参数,表示切片的容量,上面例子没有传入容量,则容量与长度相等

s = make([]int,5,10)//初始化一个长度为5,容量为10的切片

复制代码

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

var s []int

var ss = []int{}

fmt.Println(len(s),len(ss))//0,0

fmt.Println(s == nil) //true

fmt.Println(ss == nil)//false

复制代码

长度与容量计算

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

package main

import "fmt"

func main() {

	a := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

	s := a[1:3]

	fmt.Println(len(s)) //2

	fmt.Println(cap(s)) //9

}


复制代码

你的关注,是我写作路上最大的鼓励!

分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改