数组介绍
- 数组:具有固定长度相同类型元素序列
- 声明数组的语法
func main() {
//var 对象名 [长度]元素类型
var arr [5]int
fmt.Println(arr) //[0 0 0 0 0],int默认值为0
}
- 数组就是 内存中一段固定长度的连续空间
- 声明数组后数组就会在内存中开辟一块连续空间,每个值称为数组的元素,且元素值为类型对应的默认值,例如int类型默认值为0,string类型默认值为空字符串
bool //默认值为false
string //默认值为空字符串
int int8 int16 int32 int64 //默认值为0
uint uint8 uint16 uint32 uint64 uintptr //默认值为0
byte // uint8 的别名
rune // int32 的别名
float32 float64 //默认值为0
complex64 complex128 //默认值为0
- 数组中每个元素按照顺序都有自己整数类型的脚标,脚标从第一个元素为0向后依次增加1
var arr = [5]int | ||||
arr[0]=0 | arr[1]=0 | arr[2]=0 | arr[3]=0 | arr[4]=0 |
- 数组中实际开发中主要作用是充当 临时容器 ,因为声明一个数组变量比声明多个相同类型变量在操作时更加方便
数组的创建和赋值
- 可以在声明数组时可以同时给数组赋值,赋值时要求长度必须大于等于初始值个数
func main() {
//方式一:完整写法
var arr [3]int = [3]int{1, 2, 3}
//方式二:短变量方式
arr2 := [3]int{1, 2, 3}
//方式三:长度大于初始值个数,,个数为4,只给前三个元素赋值,其余元素为默认值
arr3 := [4]int{1, 2, 3}
//方式四:复制时不写长度,数组长度根据元素个数确定
arr4 := [...]int{1, 2, 3}
fmt.Println(arr, arr2, arr3, arr4)
}
- 可以通过 数组名[脚标] 对数组中元素进行操作
func main() {
arr := [...]int{1, 2, 3}
fmt.Println(arr) //输出[1 2 3]
//通过脚标对数组中元素进行重新赋值
arr[0] = 5k
arr[1] = 6
arr[2] = 7
fmt.Println(arr) //输出[5 6 7]
fmt.Println(arr[0], arr[1], arr[2]) //输出:5 6 7
}
- 通过 len(数组变量) 获取数组长度,数组脚标最大值为 长度减一 ,如果超出这个范围将会报错
func main() {
arr := [...]int{1, 2, 3}
fmt.Println(len(arr))
arr[3] = 5 //报错:invalid array index 3 (out of bounds for 3-element array)
}
数组是值类型
- 在Go语言中数组是值类型,和之前学习的int或者float64等类型相同,把一个数组变量赋值给另一个数组变量时为复制副本, 重新开辟一块空间
func main() {
arr := [...]int{1, 2, 3}
arr2 := arr
fmt.Println(arr,arr2)
fmt.Println(&arr, &arr2) //错误写法一,输出为:&[1 2 3] &[1 2 3]
fmt.Println("%p,%p",arr,arr2) //错误写法二:输出为 %p,%p [1 2 3] [1 2 3]
fmt.Printf("%p, %p",&arr, &arr2) //输出地址不一:0xc00000c3a0, 0xc00000c3c0
}
二维数组
- 二维数组表示一个数组变量中每个元素又是一个数组变量
- 声明二维数组的语法
var arr [n][m]
- 使用arr[n]时返回一个arr[m]类型的数组
- 图示:
二维数组的使用
- 声明并创建二维数组
func main() {
//写在同一行,最后一个元素后面不需要有逗号
//arr6 := [3][3]int{{1, 2, 3}.{4, 5, 6}.{7, 8, 9}}
arr := [3][3]int{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}, //每个元素分行写,最后一个必须有括号
}
arr0 := arr[0]
fmt.Println(arr0, arr[0], arr[1], arr[2]) //[1 2 3] [1 2 3] [4 5 6] [7 8 9]
}
多维数组
- 理论上支持无限多维数组(只要内存够用)
- 三维数组可以理解成,一组数组中,每个元素都是二维数组
- 四维数组可以理解成,一堆数组中每个元素都是三位数组
- 无论是几维数组,都符号元素类型是相同的
- 实际开发中多维数组使用并不多,在一定程度上,程序员使用多维数组容易出错
func main() {
arr := [2][2][2]int{
{
{1, 2},
{3, 4},
},
{
{5, 6},
{7, 8},
},
}
fmt.Println(arr) //输出:[[[1 2] [3 4]] [[5 6] [7 8]]]
//几维数组在操作元素时,数组变量后面就有几个[]
fmt.Println(arr[0][1]) //输出:[3 4]
}