GO语言学习笔记(十):GO语言中的数组

分类:
GO
标签:
基础
学习笔记
作者:
何鑫
创作时间:
2019/08/23 22:48:56

摘要:GO语言中的数组

GO语言中的数组

数组结构是一般编程语言不可缺少的数据结构。尽管在GO语言实际开发过程中,我们直接使用数组的场景并不多,但是它却是一种重要的数据结构-切片(slices)的基础,学好它对于我们后面学习切片具有非常重要的意义。

数组的创建

数组声明

func main() {
   // 声明一个长度为3的int型数组
   var array [3]int
   // 打印数组
   fmt.Println(array)
}

先声明一个长度为3的int型数组,我们打印看一下数组内容:

[0 0 0]

说明声明之后,数组各个元素会被初始化为数组元素类型的零值。

使用数组字面量快速创建并初始化数组

func main() {
   // 使用字面量创建并初始化数组
   array := [3]int{1, 2, 3}
   // 打印数组
   fmt.Println(array)
}

我们直接使用字面量初始化了数组,让我们来看看结果:

[1 2 3]

与我们预想的结果一致。

数组的长度是确定的,我们初始化的字面量个数不应大于大于此长度,否则会编译错误。如果小于此长度,则剩余元素值将被填充为零值:

func main() {
   // 使用字面量创建并初始化数组
   // array := [3]int{1, 2, 3, 4} array index 3 out of bounds [0:3]
   array := [3]int{1, 2}
   // 打印数组
   fmt.Println(array)
}

打印:[1 2 0]

我们还可以使用数组索引(数组下标)来有选择的初始化数组,索引从0开始,依次递增1,一个数组的最大索引为数组的长度减1:

func main() {
   array := [3]int{0 : 1, 2 : 3}
   // 打印数组
   fmt.Println(array)
}

我们初始化了索引为0位置的元素值为1,索引为2位置的元素值为3,打印看一下数组里的值:

[1 0 3]

索引为1的元素由于我们未给予值所以为零值。

我们可以使用...代替数组长度声明,这时的数组长度将由编译器从初始化信息中获取,如:

array := [...]int{0 : 1, 2 : 3} // 编译器将自动推断长度为3

数组的访问与修改

我们使用索引来访问和修改元素:

func main() {
   array := [3]int{1, 2, 3}
   // 获取索引为1的元素
   fmt.Println(array[1])
}

打印:2,即第二个数组元素。

修改元素:

func main() {
   array := [3]int{1, 2, 3}
   // 修改索引为1的元素为4
   array[1] = 4
   fmt.Println(array)
}

打印:[1 4 3],正确的修改了索引为1的元素。

数组的遍历

使用for循环

我们可以使用内置函数len获取数组长度:

func main() {
   array := [3]int{1, 2, 3}
   fmt.Println("数组长度是:", len(array))
}

运行打印:数组长度是: 3,与我们期望值一致。

有了数组的长度,我们就可以使用for循环来遍历数组了:

func main() {
   array := [3]int{1, 2, 3}
   for i := 0; i < len(array); i++ {
      fmt.Println(i,"-", array[i])
   }
}

输出:

        0 - 1

        1 - 2

        2 - 3

分别对应索引和值。

使用range

我们还可以使用range语句来帮助我们遍历数组:

func main() {
   array := [3]int{1, 2, 3}
   for k, v := range array {
      fmt.Println(k,"-", v)
   }
}

输出:

        0 - 1

        1 - 2

        2 - 3

与for循环遍历结果一致。

数组的比较

首先不同类型的数组肯定是不相等的,包括元素的类型和数组的长度的不同。

只有数组类型和数组长度一致的两个数组才具有可比性。

func main() {
   array1 := [3]int{1, 2, 3}
   array2 := [3]int{1, 2, 4}
   array3 := [3]int{1, 2, 3}
   fmt.Println(array1 == array2)
   fmt.Println(array1 == array3)
}

打印:

false

true

数组作为函数参数

在GO语言中数组是值类型,这就意味着在把数组当参数传递给函数时,函数中拿到是时数组的拷贝,在函数中修改该数组不会影响到原来的数组:

func main() {
   array := [3]int{1, 2, 3}
   update(array)
   fmt.Println(array)
}

func update(array [3]int)  {
   array[2] = 4
   fmt.Println("修改后的数组为:", array)
}

        修改后的数组为: [1 2 4]

        [1 2 3]

我们还没有学习函数,这里知道这个结论即可。

如果我们需要在函数中修改该数组,应该传递该数组的指针:

func main() {
   array := [3]int{1, 2, 3}
   update(&array)
   fmt.Println(array)
}

func update(array *[3]int)  {
   array[2] = 4
   fmt.Println("修改后的数组为:", *array)
}

输出:

            修改后的数组为: [1 2 4]

            [1 2 4]

修改成功,不明白指针定义的请参考GO语言学习笔记(六):类型转换与指针,使用指针的还有一个好处就是省内存,因为指针实际是地址值,只占8字节。


本章介绍了GO语言中的数组,包括数组的创建及初始化,数组的访问和修改,数组的遍历,数组的比较以及数组在函数传递中应注意的问题,如果你有任何疑问,欢迎给我留言,谢谢!

发表评论

温馨提示: 评论先审核后发布, 请勿发表不良言论

所有评论