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 协议》,转载必须注明作者和本文链接
good good study day day up
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!