Golang学习笔记_13——数组

Golang学习笔记_10------Switch
Golang学习笔记_11------指针
Golang学习笔记_12------结构体


文章目录

    • 数组
      • [1. 定义](#1. 定义)
      • [2. 访问和修改](#2. 访问和修改)
      • [3. 多维数组](#3. 多维数组)
      • [4. 计算数组长度](#4. 计算数组长度)
      • [5. 数组作为函数参数](#5. 数组作为函数参数)
      • [6. 遍历](#6. 遍历)
      • [7. 数组的内存表示](#7. 数组的内存表示)
    • 源码

数组

Go语言中的数组是一种具有固定长度、相同类型元素的集合。数组的长度是数组类型的一部分,这意味着数组的长度在定义后是固定的,不能改变。

在Go语言中,数组的使用非常基础且重要,特别是在理解切片(slice)和映射(map)等更复杂的数据结构时。

1. 定义

go 复制代码
// 数组可以通过显式地指定长度和元素类型来定义
var aar1 [5] int

// 定义时直接初始化数组的元素
var aar2 = [5]int{1, 2, 3, 4, 5}

// 省略数组的长度,编译器会根据提供的初始化值的数量自动推断
var aar3 = [...]int{1, 2, 3, 4}

2. 访问和修改

go 复制代码
// 修改数组的值
aar1[1] = 10

// 访问数组的第三个元素
value := aar[2]

3. 多维数组

go 复制代码
var matrix [3][4]int
matrix = [3][4]int{
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12},
}

// 访问多维数组
value2 := matrix[1][2]  // 访问第二行第三列的元素

4. 计算数组长度

go 复制代码
length := len(matrix)

5. 数组作为函数参数

将数组作为函数参数传递。传递的是数组的副本,因此函数内部对数组的修改不会影响外部的数组。

go 复制代码
func array_demo2(aar [5]int) {
	arr := aar
	for i := 0; i < len(arr); i++ {
		fmt.Println("Index:", i, "Value:", arr[i])
	}
	aar[2] = 100
}

测试方法

go 复制代码
func Test_array_demo2(t *testing.T) {
	aarr := [...]int{1, 2, 3, 4, 5}
	array_demo2(aarr)
	fmt.Println(aarr)
}

输出结果

=== RUN   Test_array_demo2
Index: 0 Value: 1
Index: 1 Value: 2
Index: 2 Value: 3
Index: 3 Value: 4
Index: 4 Value: 5
[1 2 3 4 5]
--- PASS: Test_array_demo2 (9.03s)
PASS

6. 遍历

go 复制代码
func array_demo3(aar [5]int) {
	arr := aar
	for i := 0; i < len(arr); i++ {
		fmt.Println("Index:", i, "Value:", arr[i])
	}

	for index, value := range arr {
		fmt.Println("Index:", index, "Value:", value)
	}
}

测试方法

go 复制代码
func Test_array_demo3(t *testing.T) {
	aar1 := [5]int{1, 2, 3, 4, 5}

	type args struct {
		aar [5]int
	}
	tests := []struct {
		name string
		args args
	}{
		{
			name: "1",
			args: args{aar: aar1},
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			array_demo3(tt.args.aar)
		})
	}
}

输出结果

=== RUN   Test_array_demo3
=== RUN   Test_array_demo3/1
Index: 0 Value: 1
Index: 1 Value: 2
Index: 2 Value: 3
Index: 3 Value: 4
Index: 4 Value: 5
Index: 0 Value: 1
Index: 1 Value: 2
Index: 2 Value: 3
Index: 3 Value: 4
Index: 4 Value: 5
--- PASS: Test_array_demo3 (0.00s)
    --- PASS: Test_array_demo3/1 (0.00s)
PASS

7. 数组的内存表示

数组在内存中是连续存储的,这意味着数组访问速度非常快。但是,数组的长度是其类型的一部分,因此不同长度的数组是不同类型,不能相互赋值。

源码

go 复制代码
// array_demo.go 文件

package array_demo

import "fmt"

func array_demo1() {
	// 数组可以通过显式地指定长度和元素类型来定义
	var aar1 [5]int

	// 定义时直接初始化数组的元素
	var aar2 = [5]int{1, 2, 3, 4, 5}

	// 省略数组的长度,编译器会根据提供的初始化值的数量自动推断
	var aar3 = [...]int{1, 2, 3, 4}

	// 修改数组的值
	aar1[1] = 10

	// 访问数组的第三个元素
	value := aar2[2]

	fmt.Println(aar3)
	fmt.Printf("aar2[2] value is %d\n", value)

	var matrix [3][4]int
	matrix = [3][4]int{
		{1, 2, 3, 4},
		{5, 6, 7, 8},
		{9, 10, 11, 12},
	}

	// 访问多维数组
	value2 := matrix[1][2] // 访问第二行第三列的元素
	fmt.Println(value2)

}

func array_demo2(aar [5]int) {
	arr := aar
	for i := 0; i < len(arr); i++ {
		fmt.Println("Index:", i, "Value:", arr[i])
	}
	aar[2] = 100
}

func array_demo3(aar [5]int) {
	arr := aar
	for i := 0; i < len(arr); i++ {
		fmt.Println("Index:", i, "Value:", arr[i])
	}

	for index, value := range arr {
		fmt.Println("Index:", index, "Value:", value)
	}
}
go 复制代码
// array_demo_test.go
package array_demo

import (
	"fmt"
	"testing"
)

func Test_array_demo2(t *testing.T) {
	aarr := [...]int{1, 2, 3, 4, 5}
	array_demo2(aarr)
	fmt.Println(aarr)
}

func Test_array_demo3(t *testing.T) {
	aar1 := [5]int{1, 2, 3, 4, 5}

	type args struct {
		aar [5]int
	}
	tests := []struct {
		name string
		args args
	}{
		{
			name: "1",
			args: args{aar: aar1},
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			array_demo3(tt.args.aar)
		})
	}
}
相关推荐
Include everything10 分钟前
【C/C++进阶】CMake学习笔记
c语言·c++·学习
Koma_zhe11 分钟前
【协作笔记Trilium Notes Docker部署】开源协作笔记Trilium Notes本地Docker部署远程协作
笔记·docker·开源
奔跑的犀牛先生11 分钟前
概率论得学习和整理28:用EXCEL画折线图,X轴数据也被当成曲线的解决办法
学习·excel
梭七y37 分钟前
【笔记】记录对自主实现一个神经网络的步骤的理解
人工智能·笔记·神经网络
奔跑的犀牛先生1 小时前
概率论得学习和整理27:关于离散的数组 & 随机变量数组的均值,方差的求法3种公式,思考和细节。
学习·均值算法·概率论
Kinky ლ2 小时前
Git 的基本概念和使用方式
笔记
m0_749317522 小时前
偷懒算法第二天
java·学习·算法·蓝桥杯·动态规划
ezreal_pan2 小时前
ShardingSphere-Proxy 连接实战:从 Golang 原生 SQL 到 GORM 的应用
golang·shardingsphere·分库分表
CHHC18802 小时前
golang 使用gzip对json例子
开发语言·golang·json
小A1592 小时前
STM32完全学习——FSMC控制LCD的一些问题
stm32·嵌入式硬件·学习