这篇文章主要讲解了“Go语言中的数组与切片介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言中的数组与切片介绍”吧!
1. 数组
数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。因为数组的长度是固定的,所以在Go语言中很少直接使用数组。
声明数组,并给该数组里的每个元素赋值(索引值的最小有效值和其他大多数语言一样是 0,不是1)
//[3]里的3表示该数组的元素个数 vararr[3]int arr[0]=1 arr[1]=2 arr[2]=3
声明并直接初始化数组
//第一种方法 vararr[3]int=[3]int{1,2,3} //第二种方法 arr:=[3]int{1,2,3}
上面的 3 表示数组的元素个数 ,万一你哪天想往该数组中增加元素,你得对应修改这个数字,为了避免这种硬编码,你可以这样写,使用...让Go语言自己根据实际情况来分配空间。
arr:=[...]int{1,2,3}
[3]int和[4]int虽然都是数组,但他们却是不同的类型,使用 fmt 的%T可以查得,如果使用 == 来比较,答案会是false
import("fmt" ) funcmain(){arr01:=[...]int{1,2,3}arr02:=[...]int{1,2,3,4}fmt.Printf("%d的类型是:%T\n",arr01,arr01)fmt.Printf("%d的类型是:%T",arr02,arr02)}
输出 如下
[1 2 3]的类型是:[3]int [1 2 3 4]的类型是:[4]int
如果你觉得每次写[3]int有点麻烦,你可以为[3]int定义一个类型字面量,也就是别名类型。
使用type关键字可以定义一个类型字面量,后面只要你想定义一个容器大小为3,元素类型为int的数组 ,都可以使用这个别名类型。
import("fmt" ) funcmain(){typearr3[3]int myarr:=arr3{1,2,3}fmt.Printf("%d的类型是:%T",myarr,myarr)}
输出 如下
[123]的类型是:main.arr3
2. 切片
切片(Slice)与数组一样,也是可以容纳若干类型相同的元素的容器。与数组不同的是,无法通过切片类型来确定其值的长度。每个切片值都会将数组作为其底层数据结构。我们也把这样的数组称为切片的底层数组。
切片是对数组的一个连续片段的引用,所以切片是一个引用类型,这个片段可以是整个数组,也可以是由起始和终止索引标识的一些项的子集,需要注意的是,终止索引标识的项不包括在切片内(意思是这是个左闭右开的区间)
import("fmt" ) funcmain(){myarr:=[...]int{1,2,3}fmt.Printf("%d的类型是:%T",myarr[0:2],myarr[0:2])}
输出 如下
[1 2]的类型是:[]int
切片的构造,有三种方式
对数组进行片段截取(上面例子已经展示:myarr[0:2],0是索引起始值,2是索引终止值,区间左半右开)
从头声明赋值(例子如下)
//声明字符串切片 varstrList[]string //声明整型切片 varnumList[]int //声明一个空切片 varnumListEmpty=[]int{}
使用 make 函数构造,make 函数的格式:make( []Type, size, cap )
这个函数刚好指出了,一个切片具备的三个属性:类型(Type),长度(size),容量(cap)
import("fmt" ) funcmain(){a:=make([]int,2)b:=make([]int,2,10)fmt.Println(a,b)fmt.Println(len(a),len(b))fmt.Println(cap(a),cap(b))}
输出 如下
[00][00] 22 210
关于 len 和 cap 的概念,可能不好理解 ,这里举个例子:
公司名,就是变量名。公司里的所有工位,相当于已分配到的内存空间公司里的员工,相当于元素。cap 代表你这个公司最多可以容纳多少员工len 代表你这个公司当前有多少个员工,所以cap>=len
由于 切片是引用类型,所以你不对它进行赋值的话,它的零值(默认值)是 nil
varmyarr[]int fmt.Println(myarr==nil) //true
数组 与 切片 有相同点,它们都是可以容纳若干类型相同的元素的容器
也有不同点,数组的容器大小固定,而切片本身是引用类型,它更像是 Python 中的 list ,我们可以对它 append 进行元素的添加。
import("fmt" ) funcmain(){myarr:=[]int{1}//追加一个元素 myarr=append(myarr,2)//追加多个元素 myarr=append(myarr,3,4)//追加一个切片,...表示解包,不能省略 myarr=append(myarr,[]int{7,8}...)//在第一个位置插入元素 myarr=append([]int{0},myarr...)//在中间插入一个切片(两个元素) myarr=append(myarr[:5],append([]int{5,6},myarr[5:]...)...)fmt.Println(myarr)}
输出 如下
[012345678]
最后,给你留一道思考题,如下这段代码:
import("fmt" ) funcmain(){varnumbers4=[...]int{1,2,3,4,5,6,7,8,9,10}myslice:=numbers4[4:6:8]fmt.Printf("myslice为%d,其长度为:%d\n",myslice,len(myslice))myslice=myslice[:cap(myslice)]fmt.Printf("myslice的第四个元素为:%d",myslice[3])}
为什么 myslice 的长度为2,却能访问到第四个元素?
myslice为[56],其长度为:2 myslice的第四个元素为:8
感谢各位的阅读,以上就是“Go语言中的数组与切片介绍”的内容了,经过本文的学习后,相信大家对Go语言中的数组与切片介绍这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!