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)
		})
	}
}
相关推荐
用户962377954484 小时前
VulnHub DC-1 靶机渗透测试笔记
笔记·测试
齐生11 天前
iOS 知识点 - IAP 是怎样的?
笔记
tingshuo29172 天前
D006 【模板】并查集
笔记
tingshuo29173 天前
S001 【模板】从前缀函数到KMP应用 字符串匹配 字符串周期
笔记
花酒锄作田8 天前
Gin 框架中的规范响应格式设计与实现
golang·gin
西岸行者8 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
starlaky8 天前
Django入门笔记
笔记·django
勇气要爆发8 天前
吴恩达《LangChain LLM 应用开发精读笔记》1-Introduction_介绍
笔记·langchain·吴恩达
悠哉悠哉愿意8 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
勇气要爆发8 天前
吴恩达《LangChain LLM 应用开发精读笔记》2-Models, Prompts and Parsers 模型、提示和解析器
android·笔记·langchain