一 数组的定义和初始化
数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整型、字符串或者自定义类型。数组元素可以通过索引(位置)来读取(或者修改),索引从 0 开始,第一个元素索引为 0,第二个索引为 1,以此类推。
- Go语言中的数组定义时长度是固定的,并且数组的元素类型必须一致。
- 数组的长度是数组类型的一部分,因此长度不同的数组类型也是不同的。
- 数组的初始化可以在定义时完成,也可以通过索引单独赋值。
在Go语言中,数组声明及初始化的方式有很多种,例如:
// 1.声明一个int类型的数组,数组长度为10,再遍历数组为其赋值
var array1 [10]int
for i := 0; i < len(array1); i++ {
array1[i] = i
}
// 2.声明一个int类型的数组,并直接初始化赋值(后面为赋值元素默认为0)
var array2 = [10]int{1, 2, 3, 4}
// 3.使用:=直接声明并初始化数组
array3 := [4]int{1, 2, 3, 4}
// 4.使用...代替数组的长度,编译器会根据元素个数自行推断数组的长度
var array4 = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
// 5.指定下标来初始化元素
array5 := [5]float32{1: 2.5, 3: 7.5}
二 数组的遍历和获取元素
在Go语言中,我们可以通过range来遍历数组元素:
for index, value := range array2 {
fmt.Println("inde = ", index, ",value = ", value)
}
当然,我们也可以通过普通的for循环进行遍历,获取元素:
for i := 0; i < len(array1); i++ {
fmt.Println(array1[i])
}
还有一种简单的方法就是直接通过数组名打印输出数组元素:
fmt.Println(array3)
三 数组作为函数参数传递
1.严格匹配数组类型
在Go中,数组的长度是固定的,并且在传参的时候,严格匹配数组类型。
func printArr(arr [4]int) {
fmt.Println(arr)
}
例如在上面的代码中,我们将一个长度为4的int型数组作为入参,打印数组内容。当我们将arrays3(长度为4的int型数组)作为参数传递时,可以正常打印出结果
但是如果我们将arrays2(长度为10的int型数组)作为参数传入,会报以下错误:
原因很简单,在Go语言中,数组的长度也是数组类型的一部分。我们将数组作为参数传递时,要严格匹配数组长度和数组元素类型。
2.数组是值类型
在Go中,数组是值类型。也就是将一个数组赋值给另一个数组,或作为参数传递时,实际是对整个数组的复制,而不是传递引用。例如,我们定义一个函数,实现修改数组的元素的功能:
func setArr(arr [4]int) {
arr[2] = 100
fmt.Println("函数中的值:", arr[2])
}
setArr(array3)
fmt.Println("查看值是否被改变:", array3[2])
查看运行结果:。
可以看到,函数中数组元素已经发生了改变,但是原数组中对应元素并未发生改变。这就是因为数组是值类型,其作为参数传递时,是将拷贝后的数组传递了,我们在函数中进行的所有操作都是针对拷贝后的数组进行的,而非是对原数组进行的。同理,下面的代码也是一样的。
array6 := array1
array6[1] = 200
fmt.Println(array1[1]) // 1
fmt.Println(array6[1]) // 200
因此,如果我们想要实现在函数内修改原始数组,可以通过传递数组的指针来实现。我们可以将上述代码改成:
func setArr1(arr *[4]int) {
arr[2] = 100
fmt.Println("函数中的值:", arr[2])
}
setArr1(&array3)
fmt.Println("查看值是否被改变:", array3[2])
这时的运行结果就是我们想要的啦:。
四 多维数组
Go语言中的多维数组与C语言相似:
var matrix [3][4]int // 定义一个3x4的二维整数数组
matrix[1][2] = 7 // 修改第二行第三列的元素为7