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的元素分别赋值为:14

同时我们也可以直接通过下标赋值,也就是说我可以直接对其中的某一个元素赋值,如下所示:

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

小结

数组在我们的实际应用中是使用比较多的,由于它是固定长度不可变的,所以在性能方面会好很多。

相较于切片来说是有一定优势的,如果我们本身知道数据的个数,那么使用数组是一个很好的选择。

经过本节的学习,我们总结一下数组的主要内容:

  • 是顺序结构存储的

  • 是固定长度的

  • 声明时需要指定长度,或者使用...进行缺省声明

  • 可以很方便的访问指定元素

  • 可以很方便的修改指定元素

  • 删除元素比较麻烦,需要创建新的数组进行复制

results matching ""

    No results matching ""