【第二十八篇】Go 数组定义和内存布局

101 阅读2分钟

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

一、数组定义和内存布局:

一、数组的定义:

  • var 数组名 [数组大小] 数据类型
  • var a [5] int
  • 赋初值 a[0]= 1 a[1] = 30 .....

二、数组内存图(重要):

package main

import "fmt"

func main() {
	var intArr [3]int // int 占8分字节
	//	当我们定义玩数组后,其实数组的各个元素都有默认值 0

	intArr[0] = 10
	intArr[1] = 10
	intArr[2] = 10

	fmt.Println(intArr)
	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

二、数组的使用:

一、访问数组元素:

数组名[下标],比如:你要使用a数组的第三个元素a[2]

二、快速入门案例

从终端循环输入5个成绩,保存到float 64数组,并输出。

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	", i, score[i])
	}
}

三、四种初始化数组的方式:

package main

import "fmt"

func main() {

	// 四种初始化数组的方式
	var numArr01 [3]int = [3]int{1, 2, 3}
	fmt.Println("numArr01 = ", numArr01)

	var numArr02 = [3]int{5, 6, 7}
	fmt.Println("numArr02 = ", numArr02)

	var numArr03 = [...]int{8, 9, 10}
	fmt.Println("numArr03 = ", numArr03)

	var numArr04 = [...]int{1: 800, 0: 900, 2: 999}
	fmt.Println("numArr04 = ", numArr04)

	// 类型推导
	numArr05 := [...]string{1: "tom", 0: "jack", 2: "mary"}
	fmt.Println("numArr05 = ", numArr05)
}

三、数组的遍历:

一、常规遍历

前面讲过了,不再赘述

二、for - range 结构遍历

这是Go 语言一种独有的结构,可以用来遍历访问数组的元素。

基本语法:

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

说明:

  1. 第一个返回值 index是数组的下标。
  2. 第二个 value 是该下标位置的值。
  3. 他们都是仅在 for 循环内部可见的局部变量。
  4. 遍历数组元素的时候,如果不想使用下标 index ,可以直接把下标 index 标为下刻线 _
  5. indexvalue 的名称不是固定的,即程序员可以自行指定,一般命名为 indexvalue
package main

import "fmt"

func main() {
	// 演示 for - range 遍历数组
	var heroes [3]string = [3]string{"宋江", "吴用", "卢俊义"}
	// heroes :=[.....]string{"宋江", "吴用", "卢俊义"}

	// 使用常规的方式遍历,我不写了....

	for i, v := range heroes {
		fmt.Printf("i = %v	v = %v\n", i, v)
		fmt.Printf("heroes[%d]= %v\n", i, heroes[i])
	}

	fmt.Println("....................")

	for _, v := range heroes {
		fmt.Printf("元素的值 = %v\n", v)
	}
}