Go - 23 Go 数组
数组
为什么需要数组?为了更方便的管理一些基本的数据;
数组可以存放多个同一类型数据,数组也是一种数据类型,在Go中,数组是值类型。
数组的定义:
var 数组名 [数组大小]数据类型
var a [5]int
赋初始值 a[0] = 1 a[1] = 20 ....
1.数组不赋值的话,默认每个元素都是0
2.数组的地址:即数组首地址(即首个元素的地址)(可以类比排队),而其他元素的地址根据第一个依次加数据类型的字节数;
示例:
var intArr [3]int
fmt.Println(intArr) // [0 0 0]
// 输出结果:数组的地址0xc00008c9c0 首个元素的地址:0xc00008c9c0 第二个元素地址:0xc00008c9c8 第三个元素址:0xc00008c9d0
fmt.Printf("数组的地址%p 首个元素的地址:%p 第二个元素地址:%p 第三个元素地址:%p", &intArr, &intArr[0], &intArr[1], &intArr[2])
数组的使用:
示例:
// 使用数组
var fArr [5]float64
for i := 0; i < len(fArr); i++ {
fmt.Printf("请输入第%d的值为: \n", i+1)
fmt.Scanln(&fArr[i])
}
// 打印
for i := 0; i < len(fArr); i++ {
fmt.Println(fArr[i])
}
四种数组初始化方式:
var numArr01 [3]int = [3]int{1,2,3}
fmt.Println("numArr01=", numArr01)
var numArr02 = [3]int{4,5,6}
fmt.Println("numArr02=", numArr02)
// [...] 固定写法
var numArr03 = [...]int{7,8,9}
fmt.Println("numArr03=", numArr03)
var numArr04 = [...]int{1:100, 0:199, 2:200} // numArr04= [199 100 200]
fmt.Println("numArr04=", numArr04)
// 类型推导
strArr05 := [...]string{1:"tom",0:"jack",3:"marry"} // strArr05= [ tom jack marry]
fmt.Println("strArr05=", strArr05)
数组的遍历:
两种方式:普通for循环/for...range...
主要使用for...range... 这是Go语言一种独有的结构,可以用来遍历访问数组的元素;
基本语法:
for index, value := range array01 {
.....
}
说明:
第一个返回值 index 是数组的下标;
第二个value 是在该下标位置的值;
他们都是仅在for循环内部可见的局部变量;
遍历数组元素的时候,如果不想使用下标index,可以直接把下标index标为下划线_
index 和 value 的名称不是固定的,即程序员可以自行指定,一般为index和value;
示例:
for index,value := range strArr05{
fmt.Println(index, value)
}
数组使用细节和注意事项:
1.数组是多个相同类型数据的组合,一个数组一旦声明/定义了,其长度是固定的,不能动态变化。
2.var arr []int 中括号中不写的话这时 arr 就是一个slice切片
3.数组中的元素可以是任何数据类型,包括值类型和引用类型,但是不能混用
4.数组创建后,如果没有赋值,有默认值(零值)
数值类型数组,默认值为0
字符串数组, 默认值为 ""
bool数组, 默认值为 false
5.使用数组的步骤:1:声明数组并开辟空间(数组的大小是数据类型的一部分);2:给数组各个元素赋值;3:使用数组;
6.数组的下标是从0开始的
7.数组下标必须在指定范围内使用,否则报panic,数组越界,比如 var arr [5]int 则有效下标为0-4
8.Go的数组属值类型,在默认情况下是值传递,因此会进行值拷贝。数组间不会相互影响;
9.如想在其它函数中,去修改原来的数组,可以使用引用传递(指针方式);
示例:
// 数组 引用传递及修改数据
func arrUpdate(arr *[3]int) {
fmt.Println("arr的地址===", &arr)
(*arr)[0] = 77
}
// 测试引用传递修改数据
numArr := [...]int{22,33,44}
arrUpdate(&numArr)
fmt.Println(numArr) // [77 33 44]
10.长度是数组类型的一部分,在传递函数参数时,需要考虑数组的长度;