数组是存放元素的容器,Go语言中数组的长度是数组类型的一部分,定义数组时必须指定存放元素的类型和容量(长度)
定义
var a1 [3]bool var a2 [4]int fmt.Printf("a1:%T\na2:%T\n", a1, a2)
打印结果:
数组初始化
默认值
定义数组时不进行初始化,默认元素都是零值:bool类型的false、整型和浮点类型的0、字符串的空串" "
var a1 [3]bool var a2 [4]int // 如果不初始化:默认元素都是零值(布尔值:false 整型和浮点类型:0 字符串:"") fmt.Println(a1, a2)
打印结果:
初始化方式1
最简单的初始化方式,在大括号中定义好和长度一致的值。
var a1 [3]bool a1 = [3]bool{true,false,false} fmt.Println(a1)
打印结果:
初始化方式2:根据初始值自动判断数组的长度
在中括号中写明长度,当定义的数值个数比长度小时,会用默认值补齐,比如:0、false、""
a8 := [10]int{0, 1, 2, 3, 4, 5, 6, 7} //7后面会用0补齐 fmt.Println(a8)
打印结果: [0 1 2 3 4 5 6 7 0 0]
[...]的用法
[...]设置数组长度时,会根据初始值自动判断数组的长度
aa := [...]int{0, 1, 2, 3, 4, 5, 6, 7} //[...]根据初始值自动判断数组的长度 fmt.Println(aa)
打印结果:[0 1 2 3 4 5 6 7]
初始化方式3:根据索引初始化
指定索引对应的值,未指定索引的值会用默认值填充,比如:0、false、""
a3 := [5]int{0: 1, 4: 2} //根据索引初始化 fmt.Println(a3)
打印结果:[1 0 0 0 2]
取值
遍历数组
fori循环遍历数组
citys := [...]string{"北京", "上海", "深圳"} //索引从0到2 // 根据索引遍历 for i := 0; i < len(citys); i++ { fmt.Println(citys[i]) }
打印结果:
for range遍历
for range遍历更简单
citys := [...]string{"北京", "上海", "深圳"} //索引从0到2 for i, city := range citys { fmt.Printf("key值:%d 城市为:%v\n", i, city) }
打印结果:
多维数组
定义
我们以二维数组举例,比如我们需要定义[[1 2 3][4 5 6]]
这样的二维数组,需要怎么定义呢?
示例如下:
- 下面代码中的第一个长度单位[2]表示二维数组的有几个元素
- 第二个长度单位[3]表示子集数组中有几个元素
- 初始化的时候:变量 = 数组类型{}
//定义多维数组 var a11 [2][3]int //初始化多维数组 a11 = [2][3]int{ [3]int{1, 2, 3}, [3]int{4, 5, 6}, //注意:最后这个也要加逗号分隔 } fmt.Println(a11)
打印结果:
取值
多维数组的遍历
//定义多维数组 var a11 [2][3]int //初始化多维数组 a11 = [2][3]int{ [3]int{1, 2, 3}, [3]int{4, 5, 6}, //注意:最后这个也要加逗号分隔 } //双重for range遍历取值 for _, v1 := range a11 { fmt.Println(v1) for _, v2 := range v1 { fmt.Println(v2) } }
打印结果:
数组特点:值类型 不是引用类型
我们发现把b1赋值给b2,再修改b2的值,b1的值并没有改变。我认为这是数组和切片最大的区别,建议大家再对比学习一下切片的知识点:Go slice切片详解和实战
b1 := [3]int{1, 2, 3} b2 := b1 b2[0] = 100 fmt.Println(b1,b2)
打印结果:
总结:说明Go的数组是值类型,不是引用类型:b2:=b1的操作,给b2开辟了新的内存空间,而不是引用b1的内存地址。
数组实战
求数组cArray[1,3,5,7,8]所有元素之和
cArray := [...]int{1, 3, 5, 7, 8} r := 0 for _, i2 := range cArray { r += i2 } fmt.Printf("相加结果为:%v", r)
打印结果:相加结果为:24
求出cArray数组中,和为8的下标,比如[0 3]和[1 2]
for i := 0; i < len(cArray); i++ { for j := 0; j < i; j++ { if cArray[i]+cArray[j] == 8 { fmt.Printf("符合的下标为:%v,%v \n", j, i) } } }
打印结果:
总结
以上就是Go数组的详解和实战应用,建议大家和Go的切片Slice对比学习,Go slice切片详解和实战,加深理解。
公众号:程序员升级打怪之旅
微信号:wangzhongyang1993