go语言之数组切片

在前一篇博客中介绍过,数组的长度在定义之后无法再次修改,数组是值类型,每次传递都将产生一份副本。显然这种数据结构无法满足开发者的真实需求。
Go语言提供数组切片,数组切片就像一个指向数组的指针,实际上它拥有自己的数据结构,而不仅仅是一个指针,数组切片可以抽象为3个变量:
a)一个指向原生数组的指针
b)数组切片中元素的个数
c)数组切片已分配的存储空间

创建数组切片的方法主要有两种----基于数组和直接创建,首先看一下基于数组的创建方法:数组切片可以基于一个已经存在的数组创建,数组切片可以只使用数组的一部分元素或者整个数组来创建,设置可以创建一个比数组还要大的数组切片。代码如下:

var myArr [10]int = [10]int{1,2,3,4,5,6,7,8,9,10} //原始数组
var mySlice []int = myArr[:5] //基于数组的前5个元素创建一个数组切片
mySlice = myArr[:] //基于整个原始数组创建一个数组切片
mySlice = myArr[5:] //基于从第5个元素开始的所有元素创建数组切片

直接创建:go语言提供的内置函数make()可以用于灵活的创建数组切片,代码如下:

mySlice1 := make([]int,5) //创建一个初始元素个数为5的数组切片,元素的初始值为0
mySlice2 := make([int],5,10) //创建一个初始元素个数为5的数组切片,元素的初始值为0,并预留10个元素的存储能力
mySlice3 := []int{1,2,3,4,5} //直接创建并初始化包含5个元素的数组切片

数组切片的遍历方式和数组的遍历方式相同,比如数组切片可以按下标读写元素,用len()函数获取元素个数,并支持使用range关键字来遍历切片中的所有元素,传统遍历方式如下:

for i := 0; i < len(mySlice); i++{
	fmt.Printf("mySlice[%d] = %d\n",i,mySlice[i])
}

使用range关键字遍历,range表达式有两个返回值,第一个是索引,第二个是元素的值,代码如下:

for i, v := range mySlice {
	fmt.Printf("mySlice[%d] = %d\n",i,v)
}

数组切片可以动态的增减元素的个数,与数组相比,数组切片多了一个存储能力的概念,即元素个数和分配的空间可以是两个不同的值,合理地设置存储能力的值可以大幅度降低数组切片内部重新分配内存和搬送内存块的频率,从而大大提高程序的性能。数组切片支持go语言内置的cap()函数和len()函数,cap()函数返回的是数组切片分配空间的大小,而len()函数返回的是数组切片中当前存储元素的个数。

package main

import "fmt"

func main() {
	mySlice := make([]int, 5, 10)
	fmt.Println("len(mySlice) = ", len(mySlice))
	fmt.Println("cap(mySlice) = ", cap(mySlice))
}

输出结果:

len(mySlice) =  5
cap(mySlice) =  10

如果需要往上例中mySlice已包含的5个元素后面继续新增元素,可以使用append()函数。函数append()的第二个参数其实是一个不定参数,我们可以按照自己需求添加若干个元素,甚至直接将一个数组切片追加到另一个数组切片的末尾。需要注意的是第二个参数后面加了三个点,即一个省略号,如果没有这个省略号,会有编译错误,因为按照append()的语义,从第二个参数器的所有参数都是待附加的元素,加上省略号后会把数组切片包含的元素打散后传入。

mySlice = append(mySlice,1,2,3) //向mySlice中追加3个元素,从而生成一个新的数组切片
mySlice2 := []int{3,4,5}
mySlice = append(mySlice,mySlice2...)//给mySlice追加另一个数组切片

数组切片支持go语言的内置函数copy()函数,用于将内容从一个数组切片复制到另一个数组切片,如果加入的两个数组切片不一样大,就会按照其中小的那个数组切片的元素进行复制,代码如下:

slice1 := []int{1,2,3,4,5}
slice2 := []int{6,7,8}
copy(slice2,slice1) //只会复制slice1的前3个元素到slice2中
copy(slice1,slice2) //只会复制slice2中的前3个元素到slice1的前三个位置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值