失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > [Golang]slice的用法以及和数组的区别

[Golang]slice的用法以及和数组的区别

时间:2023-02-09 00:04:52

相关推荐

[Golang]slice的用法以及和数组的区别

说明

slice是go的一个语言特性,其实有点类似于cpp的vector,可变长度,可以扩展空间。今天详细看了下,做下总结。

slice本质上是一个区间,原型是[]T,大致的实现是这样的:

type slice struct {first *Tlen intcap int}

可以看到的是是一个指向数组的指针,那么在修改slice的时候会改变数组的值。

用法

和数组的用法差别不是太大。

基于数组的创建:

var myArrary [3]int = [3]int{1,2,3}var mySlice []int = myArray[:2] //[first:last]方式,不足时补0

直接创建:

mySlice = make([]int, 5)//创建了长度为5初值为0的切片mySlice = make([]int, 5, 10)//创建了长度为5,容量为10的切片

函数

len() 返回元素的个数

cap()返回容器大小

append()新增元素

mySlice = append(mySlice, 1, 2, 3) //后者的参数类型其实是不定参数mySlice2 = []int{7, 8, 9}mySlice = append(mySlice, mySlice2...) 加入...表示打散后传入

copy()深复制slice

slice1 := []int{1, 2, 3, 4, 5}slice2 := []int{1, 2, 3}copy(slice2, slice1)//copy slice的前3个元素到slice2slice2 = slice1 //会复制一份引用给slice2

和数组区别

func arrayModify(array [5]int) {newArray := arraynewArray[0] = 88}func sliceModify(slice []int) {newSlice := slicenewSlice[0] = 88}func main() {array := [5]int{1, 2, 3, 4, 5}slice := []int{1, 2, 3, 4, 5}arrayModify(array)sliceModify(slice)fmt.Println(array)fmt.Println(slice)}// [1 2 3 4 5]// [88 2 3 4 5]

可以看到的是数组传的是值,不会改变元素的值,这一点和c/cpp不同,而虽然slice也是值语义,但是其本身是指针类型的,所以会改变值,但不意味着slice传引用,这一点需要注意。后面会详细讲值语义带来的问题。

扩展阅读:

/bobodem/article/details/80188126

如果觉得《[Golang]slice的用法以及和数组的区别》对你有帮助,请点赞、收藏,并留下你的观点哦!

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