Golang 数组

1.为什么需要数组

看一个问题

一个养鸡场有 6 只鸡,它们的体重分别是 3kg,5kg,1kg,3.4kg,2kg,50kg 。请问这六只鸡的总体重是
多少?平均体重是多少? 请你编一个程序。=》数组

使用传统的方法来解决

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package main
import (
"fmt"
)

func main() {

/*
一个养鸡场有6只鸡,它们的体重分别是3kg,5kg,1kg,
3.4kg,2kg,50kg 。请问这六只鸡的总体重是多少?平
均体重是多少? 请你编一个程序。=》数组

*/

//思路分析:定义六个变量,分别表示六只鸡的,然后求出和,然后求出平均值。
hen1 := 3.0
hen2 := 5.0
hen3 := 1.0
hen4 := 3.4
hen5 := 2.0
hen6 := 50.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 中,数组是值类型。

我们使用数组的方法来解决养鸡场的问题.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package main
import (
"fmt"
)

func main() {


//使用数组的方式来解决问题

//1.定义一个数组
var hens [7]float64
//2.给数组的每个元素赋值, 元素的下标是从0开始的 0-5
hens[0] = 3.0 //hens数组的第一个元素 hens[0]
hens[1] = 5.0 //hens数组的第2个元素 hens[1]
hens[2] = 1.0
hens[3] = 3.4
hens[4] = 2.0
hens[5] = 50.0
hens[6] = 150.0 //增加一只鸡
//3.遍历数组求出总体重
totalWeight2 := 0.0
for i := 0; i < len(hens); i++ {
totalWeight2 += hens[i]
}

//4.求出平均体重
avgWeight2 := fmt.Sprintf("%.2f", totalWeight2 / float64(len(hens)))
fmt.Printf("totalWeight2=%v avgWeight2=%v", totalWeight2, avgWeight2)


}

对上面代码的总结

  1. 使用数组来解决问题,程序的可维护性增加.
  2. 而且方法代码更加清晰,也容易扩展。






3.数组内存中的布局

代码说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
* @Author: Administrator
* @Description:
* @File: 0.内存中的数组
* @Version: 1.13.4
* @Date: 2020/1/22 16:44
*/

package main

import "fmt"

func main(){

var intArry [3]int
//当我们定义完数组后,其实数组的各个元素有默认值为0的数值
fmt.Println(intArry)//[0 0 0]


/*
首先可以肯定一点是,从如下的输出代码,我们可以看出整个数组列表的地址和数字下表为0的第一个元素地址,是相同的,那么得出的结论就是,intArry[0] 就是代表数组本身的地址
*/
fmt.Printf("intArry的地址=:%p intArry[0]的地址:%p",&intArry,&intArry[0])
//输出结果intArry的地址=:0xc000010300 intArry[0]的地址:0xc000010300

fmt.Printf("intArry的地址=:%p intArry[0]的地址:%p",&intArry,&intArry[1])

//第二个元素地址是? 这里直接说明一下,其实他是第一个地址的原基础上,加上这个数组类型占用的字节数
//因此结果是:0xc000010308 以此类推,他的存在方式是以十六进制方式相加,当你 取到第三个元素时 intArry[2] 此时内存地址 会以 0xc000010308 的基础上加8个字节 得到的结果会以十六进制进位表示0xc000010310

//为啥当 fmt.println(intArry) 时会整体输出数组以及里面的数值呢?
//因为当取值的时候会按照循序依次往后加当前类型的字节数,进行取值,所以能够一次性的把所有值取完。
}

数组内存的示意图:

1579683809143