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)
}