1. 为什么需要数组
问题:
一个养鸡场有6只鸡,它们的体重分别是3kg,5kg,1kg,3.4kg,2kg,50kg。请问这六只鸡的总体重是多少?平均体重是多少?
传统方法:
package main
import (
"fmt"
)
// 一个问题:
// 一个养鸡场有6只鸡,它们的体重分别是3kg,5kg,1kg,3.4kg,2kg,50kg。
// 请问这六只鸡的总体重是多少?平均体重是多少?请你编写一个程序 =》 数组
func main() {
ji1 := 3.0
ji2 := 5.0
ji3 := 1.0
ji4 := 3.4
ji5 := 2.0
ji6 := 50.0
totalWeight := ji1 + ji2 + ji3 + ji4 + ji5 + ji6
// fmt.Sprintf("%.2f",totalWeight / 6) 将 totalWeight / 6 四舍五入保留到小数点2位返回值
avarageWeight := fmt.Sprintf("%.2f",totalWeight / 6)
fmt.Printf("totalWeight = %v, avarageWeight = %v",totalWeight,avarageWeight)
}
对上面代码的说明:
1)使用传统的方法不利于数据的管理和维护
2)传统的方法不够灵活,因此我们就引出了需要学习的新的数据类型 => 数组
2. 数组的基本介绍
数组可以存放多个同一类型数据,数组也是一种数据类型,在Go中,数组是值类型
3. 数组的快速入门
用数组来解决养鸡问题:
package main
import (
"fmt"
)
func main() {
// 使用数组来解决养鸡问题
// 1. 定义一个数组
var jis [6]float64
// 2. 给数组的每个元素赋值
jis[0] = 3
jis[1] = 5
jis[2] = 1
jis[3] = 3.4
jis[4] = 2
jis[5] = 50
// 3. 遍历数组求出总体重
totalWeight := 0.0
for i := 0; i < len(jis); i++ {
totalWeight += jis[i]
}
// 4. 求出平均体重
averageWeight := fmt.Sprintf("%.2f",totalWeight / float64(len(jis)))
fmt.Printf("总体重为:%v,平均体重为:%v",totalWeight,averageWeight)
}
对上面代码的总结:
1)使用数组来解决养鸡问题,程序的可维护性提高了
2)而且方法代码更加清晰,也容易扩展
4. 数组的定义
var 数组名 [数组大小]数据类型
var intArr [5]int
5. 数组在内存的布局
案例如下:
package main
import (
"fmt"
)
func main() {
var intArr [3]int // int占8个字节
// 当我们定义完数组后,数组的各个元素就已经有默认值了
fmt.Printf("intArr的地址%p intArr[0]的地址是%p intArr[1]的地址是%p intArr[2]的地址是%p",&intArr,&intArr[0],&intArr[1],&intArr[2])
}
内存图:
对上图的总结:
1)数组的地址可以通过数组名来获取 &intArr
2)数组的第一个元素的地址,就是数组的首地址
3)数组的各个元素的地址间隔是依据数组的类型决定的,比如 int64 -> 8 int32 -> 4
之间的地址差为数组类型字节数的长度(运算为16进制的差)
6. 访问数组元素
数组名[下标] 比如:你要使用a数组的第三个元素: a[2]
7. 快速入门案例
从终端输入5个成绩,保存到float64的数组中,并输出
package main
import (
"fmt"
)
func main() {
// 问题:从终端输入5个成绩,保存到float64数组,并输出
var score [5]float64
for i := 0; i < len(score); i++ {
fmt.Printf("请输入第%d个元素的值 \n", i+1)
fmt.Scanln(&score[i])
}
// 打印
for i := 0; i < len(score); i++ {
fmt.Printf("score[%d] = %v \n",i,score[i])
}
}
8. 四种初始化数组的方式
package main
import (
"fmt"
)
func main() {
// 四种初始化数组的方式(也支持类型推导,即 := )
// 1.
var numArr01 [3]int = [3]int{1,2,3}
// 2.
var numArr02 = [3]int{1,2,3}
// 3.
var numArr03 = [...]int{1,2,3}
// 4.
var numArr04 = [...]int{1: 800, 2: 900, 4: 1100, 0: 700, 3: 1000}
// 5. 类型推导
numArr05 := [...]int{1,2,3}
fmt.Println("numArr01",numArr01)
fmt.Println("numArr02cls",numArr02)
fmt.Println("numArr03",numArr03)
fmt.Println("numArr04",numArr04)
fmt.Println("numArr05",numArr05)
}