失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > go语言数据类型之切片slice

go语言数据类型之切片slice

时间:2020-05-28 08:31:55

相关推荐

go语言数据类型之切片slice

初识

Slice(切片)代表变长的序列,序列中每个元素都有相同的类型。一个slice类型一般写作[]T,其中T代表slice中元素的类型;slice的语法和数组很像,只是没有固定长度而已,slice在底层引用了一个数组对象。

长度和容量

slice的长度对应slice中元素的数目;

长度不能超过容量,容量一般是从slice的开始位置到底层数据的结尾位置。内置的len和cap函数分别返回slice的长度和容量。

slice的切片操作s[i:j],其中0 ≤ i≤ j≤ cap(s),用于创建一个新的slice,引用s的从第i个元素开始到第j-1个元素的子序列。

切片操作超出cap(s)的上限将导致一个panic异常,但是超出len(s)则是意味着扩展了slice

我们先定义一个底层数组:

months := [...]string{1: "January", /* ... */, 12: "December"}

让我们分别定义表示第二季度和北方夏天月份的slice,它们有重叠部分:

Q2 := months[4:7]summer := months[6:9]fmt.Println(Q2) // ["April" "May" "June"]fmt.Println(summer) // ["June" "July" "August"]

我们可以看到,切片操作s[i:j]返回新的slice,它的长度len是j-i,它的容量cap是底层数组的长度减去开始截取的元素所在的索引 i

slice的比较

两个slice之间不能做比较,slice唯一合法的操作是和nil做比较,例如:

if summer == nil {/* ... */ }

slice计算长度

如果你需要测试一个slice是否是空的,使用len(s) ==0 来判断,而不是 s == nil来判断。

slice赋值拷贝

下面的例子,展示了slice底层公用一个数组

func main() {s1 := make([]int, 3) //[0 0 0]s2 := s1 //将s1直接赋值给s2,s1和s2共用一个底层数组s2[0] = 100fmt.Println(s1) //[100 0 0]fmt.Println(s2) //[100 0 0]}

append函数

Go语言的内建函数append()可以为切片动态添加元素。 可以一次添加一个元素,可以添加多个元素,也可以添加另一个切片中的元素(后面加…)。

func main(){var s []ints = append(s, 1) // [1]s = append(s, 2, 3, 4) // [1 2 3 4]s2 := []int{5, 6, 7} s = append(s, s2...) // [1 2 3 4 5 6 7]}

一次性追加多个元素

var citySlice []string// 追加一个元素citySlice = append(citySlice, "北京")// 追加多个元素citySlice = append(citySlice, "上海", "广州", "深圳")// 追加切片a := []string{"成都", "重庆"}citySlice = append(citySlice, a...)fmt.Println(citySlice) //[北京 上海 广州 深圳 成都 重庆]

copy函数的使用

Go语言内建的copy()函数可以迅速地将一个切片的数据复制到另外一个切片空间中,copy()函数的使用格式如下:

copy(destSlice, srcSlice []T)

其中:

srcSlice: 数据来源切片

destSlice: 目标切片

示例:

func main() {// copy()复制切片a := []int{1, 2, 3, 4, 5}c := make([]int, 5, 5)copy(c, a)//使用copy()函数将切片a中的元素复制到切片cfmt.Println(a) //[1 2 3 4 5]fmt.Println(c) //[1 2 3 4 5]c[0] = 1000fmt.Println(a) //[1 2 3 4 5]fmt.Println(c) //[1000 2 3 4 5]}

切片删除元素

go语言没有提供删除元素的函数,我们根据slice本身特性来删除

func main() {// 从切片中删除元素a := []int{30, 31, 32, 33, 34, 35, 36, 37}// 要删除索引为2的元素a = append(a[:2], a[3:]...)fmt.Println(a) //[30 31 33 34 35 36 37]}

总结:要从切片a中删除索引为index的元素,操作方法是a = append(a[:index], a[index+1:]…)

如果觉得《go语言数据类型之切片slice》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。