1.为什么需要数组
看一个问题:
一个养鸡场有6只鸡,体重分别为2kg,3kg,4kg,6kg,8kg,20kg,请问这6只鸡的总体重为多少? 平均体重为多少?
编写一个程序(引出数组)
使用传统方式:
package main
import (
"fmt"
)
func main() {
/**
* 一个养鸡场有6只鸡,体重分别为2kg,3kg,4kg,6kg,8kg,20kg,
* 请问这6只鸡的总体重为多少? 平均体重为多少?
* 编写一个程序 => 数组
*/
//传统方式:
//思路分析: 定义6个变量,分别表示六只鸡,然后求和,求出平均值
hen1 := 2.0
hen2 := 3.0
hen3 := 4.0
hen4 := 6.0
hen5 := 8.0
hen6 := 20.0
totalWeight := hen1 + hen2 + hen3 + hen4 + hen5 + hen6
// fmt.Sprintf("%.2f", totalWeight / 6) // 将totalWeight / 6四舍五入保存到小数点2位返回值
avgWeight := fmt.Sprintf("%.2f", totalWeight / 6)
fmt.Printf("totalWeight = %v, avgWeight = %v \n", totalWeight, avgWeight)
}
对上面代码说明:
1.使用传统的方法不利于数据的管理和维护
2.传统的方法不够灵活,因此引出新的数据类型:数组
2.数组的介绍
数组可以存放多个同一类型的数据,数组也是一种数据类型,在go语言中,数组是值类型
3.数组的快速入门
使用数组方式解决上面养鸡场问题
package main
import (
"fmt"
)
func main() {
/**
* 一个养鸡场有6只鸡,体重分别为2kg,3kg,4kg,6kg,8kg,20kg,
* 请问这6只鸡的总体重为多少? 平均体重为多少?
* 编写一个程序 => 数组
*/
//使用数组方式
//1.定义数组变量
var hens [6]float64
//2.给数组的每一个元素赋值,元素的下标从0开始,0~5
hens[0] = 2.0
hens[1] = 3.0
hens[2] = 4.0
hens[3] = 6.0
hens[4] = 8.0
hens[5] = 20.0
//3.遍历数组求出和
totalWeigh2 := 0.0
for i := 0; i <= len(hens); i++ {
totalWeigh2 += hens[i]
}
//4.平均值
avgWeight2 := fmt.Sprintf("%.2f", totalWeigh2 / float64(len(hens)))
fmt.Printf("totalWeight2 = %v, avgWeight2 = %v \n", totalWeigh2, avgWeight2)
}
对上面代码说明:
1.使用数组解决问题,程序的可维护性增加
2.代码更加清晰,容易扩展
数组的定义和内存布局
对上图的总结:
1.数字的地址可以通过数组名来获取:&intArr
2.数组的第一个元素的地址,就是数组的首地址
3.数组的各个元素的地址间隔是依据数组的类型决定的,比如:int64 => 8, int32 => 4
4.取一个数组中的数据,最快的速度是从内存地址中取,不过需要知道地址分配的规律
package main
import(
"fmt"
)
func main() {
var intArr [3]int //int占8个字节
//当我们定义完数组后,数组的各个元素都有默认值0
fmt.Println(intArr)
intArr[0] = 10
intArr[1] = 20
intArr[2] = 30
fmt.Printf("intArr的地址为: %p, intArr[0]的地址为:%p, intArr[1]的地址为:%p\n",
&intArr,&intArr[1],&intArr[2])
}
4.数组的使用
1).访问数组元素
数组名[下标]
eg:使用数组的第三个元素: arr[2]
2).快速入门
package main
import(
"fmt"
)
func main(){
// 从终端循环输入5个成绩,保存到float64数组,并输出
var score [5]float64
for i := 0; i < len(score); i++ {
fmt.Printf("请输入第%d个元素", i+ 1)
fmt.Scanln(&score[i])
}
//打印
for i :=0; i < len(score); i++ {
fmt.Printf("score[%d] = %v\n", i, score[i])
}
}
3).四种初始化数组方式
package main
import (
"fmt"
)
func main() {
// 四种初始化数组方式
var numArr1 [3]int = [3]int{1,2,3}
fmt.Println("numArr1=", numArr1)
var numArr2 = [3]int{11,22,33}
fmt.Println("numArr2=", numArr2)
//[...]是固定写法
var numArr3 = [...]int{1: 111,2: 222,0: 333}
fmt.Println("numArr3=", numArr3)
var numArr4 = [...]int{12, 23, 34}
fmt.Println("numArr4=", numArr4)
//类型推导
strArr5 := [...]string{1:"tom", 0: "jack", 3: "mary"}
fmt.Println("strArr5=", strArr5)
}