4.2 数组
数组是Go
语言中一种常用的数据类型,也是一种常用的数据结构,在实际的运用中,我们经常会使用到数组来进行一些业务的实现。
本节代码存放目录为 lesson7
什么是数组?
从名称我们可以看出,数组就是数字的组合,那么数字组合在一起自然就会形成一堆数字。
正常来说我们首先想到的就是排队,就是一堆数字像做操排队一样的排成一串,实际上在Go
语言中,数组也的确是这样的。
在Go
语言中,数组就是一堆相同类型的数据按照顺序排列在一起,就像做操排队一样,要么是同一个班级的,要么是同一个年级的,这样才会排在一起。
声明数组
在Go
语言中,数组的声明遵循一定的规则即可。
如下所示,其中arrayName
与之前讲到的变量声明是一样的,代表数组变量名称。
size
代表的是数据里面数据的长度,比如说有10
个元素,那么size
就是10
。
dataType
则是代表数组元素的类型,比如这个数组里面的元素都是int
类型的,那么dataType
就是int
。
var arrayName [size]dataType
如下代码所示,根据上面的公式,我们可以定义多种数据类型的数组:
var a [5]int;
var b [5]int64;
var c [5]string;
那么现在我们就可能有疑惑,5
是一定要写的吗?
其实不是,如果我们不想写,那么可以使用...
进行替代,这样写了之后,在编译程序的时
候,那么编译器会自动去识别数组到底有几个元素,之后会将这个值补充进去。
需要注意的是,如果这样处理的话,那么在数组中一定需要声明值。如下所示:
var c = [...]string{"12", "45", "78"}
数组赋值
数组的赋值有多重方式。
其中包括声明式赋值,也就是在声明数组变量的时候就可以赋值,代码如下所示:
var a = [5]int{1, 2, 3, 4, 5}
我们还可以针对指定下标的元素赋值,下标是从0
开始的,也就是说,第一个元素的下标是0
,第二个元素的下标是1
,依次类推。赋值方法如下所示:
var b = [5]int64{1: 1, 4: 4}
在上面的例子中,我们在声明数组变量的同时,为下标1
、下标4
的元素分别赋值为:1
、4
。
同时我们也可以直接通过下标赋值,也就是说我可以直接对其中的某一个元素赋值,如下所示:
var b = [5]int64{1: 1, 4: 4}
b[2] = 2
在上面的示例中,使用b[2] = 2
直接将数组的第三个元素的值更新为了2
。
那么如果我们没有赋值的话,元素的值是什么呢?在没有赋值的情况下,数组的元素为数组数据类型的默认值,比如数组是int
类型的,那么默认值就是0
,如果是string
类型的,那么默认值就是""
,也就是空字符串。
获取数组元素的值
获取数组元素的值是比较常用的操作,获取元素我们也有多种方式。
在上面的赋值介绍中,我们通过下标进行赋值,同样的,我们也可以通过下标直接取值,如下所示:
var b = [5]int64{1: 1, 4: 4}
b[2] = 2
fmt.Println(b[2])
输出结果如下:
2
同时我们还可以通过遍历数组的方式获取到元素值,如下所示:
var b = [5]int64{1: 1, 4: 4}
b[2] = 2
for i := 0; i < len(b); i++ {
if i == 2 {
fmt.Println(b[i])
}
}
输出结果如下:
2
修改元素的值
修改元素与获取元素的值其实是差不多的,同样的可以使用:指定下标更新、遍历更新两种方式,代码如下所示:
for i := 0; i < len(b); i++ {
if i == 2 {
b[i] = 3
}
}
fmt.Println(b[2])
b[2] = 5
fmt.Println(b[2])
输出结果如下:
3
5
删除元素
在基本所有语言中,都没有提供直接删除元素的方法,在Go
语言中同样也是这样。
如果要删除一个元素,那么我们只能采取一种方式,那就是遍历数组,将需要的元素移动到另一个新的数组中。
如下所示,我不需要b
数组的第三个元素,也就是下标为2
:
var d = [len(b) - 1]int64{}
for i := 0; i < len(b); i++ {
if i == 2 {
continue
}
// 将元素添加到新的数组
if i < 2 {
d[i] = b[i]
continue
}
d[i-1] = b[i-1]
}
fmt.Println(d[1])
在上面的代码中,我们需要从b
数组中删除第三个元素,也就是下标为2
。
首先我们定义了一个数组d
用来存储新的数组。
之后我们对b
数组进行遍历,如果处理到了下标为2
的,也就是第三个元素,那么就不添加,这里我们使用到了continue
,在下一章会讲到它具体的用法。
循环遍历
在Go
语言中,我们有两种方式来遍历数组。
第一种是上面提到过的,使用 for i:=0; i < len(array); i ++
的方式,其中len(array)
就是获取数组的长度。
for i := 0; i < len(b); i++ {
if i == 2 {
fmt.Println(b[i])
}
}
除此之外还有另一种方法,使用for range
的方式,代码如下:
for index, value := range b {
fmt.Printf("index-> %d, value-> %d\n", index, value)
}
输出结果如下:
index-> 0, valud-> 0
index-> 1, valud-> 1
index-> 2, valud-> 5
index-> 3, valud-> 0
index-> 4, valud-> 4
使用for range
的时候,我们可以取到两个值,第一个index
值代表数组的下标索引,第二个值value
代表数组该下标实际的值。
当我们不需要获取下标的时候,我们也可以这样写:
for _, value := range b {
fmt.Printf("value-> %d\n", value)
}
输出结果如下:
value-> 0
value-> 1
value-> 5
value-> 0
value-> 4
小结
数组在我们的实际应用中是使用比较多的,由于它是固定长度不可变的,所以在性能方面会好很多。
相较于切片来说是有一定优势的,如果我们本身知道数据的个数,那么使用数组是一个很好的选择。
经过本节的学习,我们总结一下数组的主要内容:
是顺序结构存储的
是固定长度的
声明时需要指定长度,或者使用
...
进行缺省声明可以很方便的访问指定元素
可以很方便的修改指定元素
删除元素比较麻烦,需要创建新的数组进行复制