Array数组
数组
赋值和传参是复制整个数组而不是指针
数组是固定长度的特定类型元素组成的序列。一个数组由零或多个元素组成。数组的长度是固定,因此Go更常用Slice(切片,动态增长或收缩序列)。数组是值类型,用索引下标访问每个元素,范围是0~len(数组)-1,访问越界会panic异常
定义数组
var 数组名 [数组大小]数据类型
var a1 [5]int
因为是int 类型,所以定义数组后,5个元素都有默认值 0
数组赋值方式
a[0]=1
a[1]=2
//声明赋值方式
var a1 [5]string = [5]string{"大猫", "二狗"}
//自动类型推导,未赋值的有默认值
var a2 = [5]int{1, 2, 3}
//自动判断数组长度
var a3 = [...]int{1, 2, 3, 4, 5}
// fmt.Println(a3)
//[1 2 3 4 5]
//指定索引赋值元素
var a4 = [...]string{3: "狗蛋", 6: "猫屎"}
fmt.Println(a4)
// [ 狗蛋 猫屎]
//结构体类型数组
var a5 = [...]struct {
name string
age int
}{
{"王麻子", 10},
{"吕秀才", 29},
}
fmt.Println(a5)
// [{王麻子 10} {吕秀才 29}]
数组的第一个元素的地址,就是数组的首地址
数组各个元素地址间隔根据数组的数据类型决定,int64 8字节 int32 4字节
案例
var intArr [5]int
fmt.Println("intArr默认值是:", intArr)
// intArr默认值是: [0 0 0 0 0]
intArr[0] = 1
intArr[1] = 2
intArr[2] = 3
fmt.Println("intArr赋值后的值是:", intArr)
//intArr赋值后的值是: [1 2 3 0 0]
fmt.Printf("intArr数组地址是=%p\n", &intArr)
//intArr数组地址是=0xc000108030
fmt.Printf("intArr数组第一个元素地址是=%p\n", &intArr[0])
//intArr数组第一个元素地址是=0xc000108030
fmt.Printf("intArr数组第二个元素地址是=%p\n", &intArr[1])
//intArr数组第二个元素地址是=0xc000108038
fmt.Printf("intArr数组第三个元素地址是=%p\n", &intArr[2])
//intArr数组第三个元素地址是=0xc000108040
数组使用步骤
1. 声明数组
2. 给数组元素赋值
3. 使用数组
4. 数组索引从0开始,且不得越界否则panic
5. Go数组是值类型,变量传递默认是值传递,因此会进行值拷贝
6. 修改原本的数组,可以使用引用传递(指针)
详细介绍为啥需要 传指针
因为传数组进去,会进行值拷贝,参数传过去的数据,是之前数据的备份,如果想改老数据,需要传的是老数据的指针,这个跟php 中的 &item 有点像
php代码
& 这个符号是取指针运算符,实际上是对指针操作,所以是对原数据的修改
function test(&$a){
$a=$a+100;
}
go
//函数修改原本数组,需要使用引用传递
func test2(arr *[3]int) {
(*arr)[0] = 66 //可以缩写arr[0]=66 编译器自动识别,arr是指针类型
}
//test2修改了数组
test2(&arr)
test函数不会修改数组
test(arr)
本作品采用《CC 协议》,转载必须注明作者和本文链接