【一Go到底】第二十六天---数组入门

96 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情

一、介绍

1.1 数组简介

数组可以存放多个同一类型的数据。数组也是一种数据类型,在Go中,数组是值类型(之前有提过)

1.2 基本语法

var 数组名 [数组大小]数据类型
// 例,声明一个名为 arr1的数组,大小为5,类型为int
var arr1 [5]int
// 赋值
a[0] = 1
a[1] = 2
......

1.3 快速上手案例(计算平均值)

package main

import "fmt"

func main() {

	// 定义数组,可以指定数组长度
	var arr [6]float64

	// 给数组赋值
	arr[0] = 1.1
	arr[1] = 2.2
	arr[2] = 3.3
	arr[3] = 4.4
	arr[4] = 5.5
	arr[5] = 6.6

	// 求和
	sum := 0.0
	for i := 0; i < len(arr); i++ {
		sum += arr[i]
	}

	// 求平均值
        // 总和 = 23.1, 平均值 = 3.85 
	ave := fmt.Sprintf("%.2f", sum/float64(len(arr)))
	fmt.Printf("总和 = %v, 平均值 = %v \n", sum, ave)

}

二、数组定义和内存布局

数组中元素地址

在下面的例子中,可以看到 数组地址和数组中第一个元素的地址是相同的,数组中后面的元素地址在 第一个元素地址 + 8个字节(int64类型),若是int32类型,那么就 +4个字节。并且内存空间是连续的

package main

import "fmt"

func main() {
	// 声明一个数组
	var intArr [3]int  // int64 占8个字节,int32 占4个字节

	// 查看数组地址
	//intArr 的地址是 0xc000014168,
	// 第一个元素地址 = 0xc000014168, 第二个元素地址 = 0xc000014170, 第三个元素地址 = 0xc000014178
	fmt.Printf("intArr 的地址是 %p, 第一个元素地址 = %p, 第二个元素地址 = %p, 第三个元素地址 = %p",
		&intArr, &intArr[0], &intArr[1], &intArr[2])
}

三、数组的使用

3.1 访问数组

数组名[下标] ,例:

var arr01 [10] int
arr01[0] = 100
fmt.Println("arr01的第一个元素是: ", arro1[0])

3.2 初始化数组

package main

import "fmt"

func main() {

	// 方式一
	var array01 [10]int = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
	// array01 =  [1 2 3 4 5 6 7 8 9 10]
	fmt.Println("array01 = ", array01)

	// 方式二
	var array02 = [10]int{2, 1, 2, 3, 4, 5, 6, 7, 8, 9}
	// array02 =  [2 1 2 3 4 5 6 7 8 9]
	fmt.Println("array02 = ", array02)

	// 方式三
	// [...] 固定语法
	var array03 = [...]int{3, 1, 2, 3, 4}
	// array03 =  [3 1 2 3 4]
	fmt.Println("array03 = ", array03)

	// 方式四
	// 指定下标写法
	// 按照下标排序输出
	var array04 = [...]int{1: 100, 2: 200, 0: 4, 3: 300}
	// 类型推导
	array05 := [...]string{3: "Mike", 1: "June", 0: "Kangkang", 2: "Feng"}
	// array04 =  [4 100 200 300]
	// array05 =  [Kangkang June Feng Mike]
	fmt.Println("array04 = ", array04)
	fmt.Println("array05 = ", array05)

}


3.3 快速上手案例

从终端接收用户输入成绩,保存到arr01数组,类型为float64,最后输出数组

package main

import "fmt"

func main() {
	// 声明数组
	var arr01 [5]float64
	// 声明成绩变量
	var score float64
	for i := 0; i < len(arr01); i++ {
		fmt.Printf("请输 %d 位的成绩: ", i+1)
		fmt.Scanln(&score)
		arr01[i] = score
	}
	fmt.Println("输入的成绩: ", arr01)
}

四、Golang的for-range数组遍历

for-range是Golang特有的一种遍历方式

4.1 基本语法

for index, value := range array {
    .......
}

  1. index 返回值是 数组元素的下标
  2. value 返回值是 数组元素的值
  3. 仅在for-range循环中有效
  4. 若不想要index,那么可以使用下划线_ 获取下标
  5. index,value 的名称不固定,只是习惯性命名,程序员可自行命名

4.2 for-range 快速上手案例

package main

import "fmt"

func main() {

	// 定义数组

	nums := [...]string{"one", "two", "three"}
	for index, value := range nums {
		// nums 数组中第 0 个元素 = one
		// nums 数组中第 1 个元素 = two
		// nums 数组中第 2 个元素 = three
		fmt.Printf(" nums 数组中第 %d 个元素 = %s\n", index, value)
	}

	for i, _ := range nums {
		// num第0个元素 = one
		// num第1个元素 = two
		// num第2个元素 = three
		fmt.Printf("num第%d个元素 = %s\n", i, nums[i])
	}
}