Go语言入门(10)-数组

访问数组元素:

数组中的每个元素都可以通过"\[\]"和一个从0开始的索引进行访问

数组的长度可由内置函数len来确定。在声明数组时,未被赋值元素的值是对应类型的零值。下面看一个例子

Go 复制代码
package main

func main(){
    
    var planets [8]string

    planets[0] = "Mercury"
    planets[1] = "Venus"
    planets[2] = "Earth"

    earth := planets[2]
    fmt.Println(earth)

    fmt.Println(len(planets))
    fmt.Println(planets[3] = "")
}

结果自行编译运行查看哈。

数组越界:

Go编译器在检测到对越界元素的访问时会报错。如果Go编译器在编译时未能发现越界错误,那么程序在运行时会出现panic,而Panic会导致程序崩溃。

Go 复制代码
var planets [8]string

		i := 8
		planets[i] = "Pluto"
		pluto := planets[i]

		fmt.Println(pluto) //以上程序报错,数组越界。[8]指数组的内存为8,从0开始数

使用复合字面值初始化数组:

复合字面值(composite literal)是一种给复合类型初始化的紧凑语法。Go的复合字面值允许我们只用一步就完成数组声明和数组初始化两步操作:

Go 复制代码
dwarfs := [5]string{"Ceres", "Pluto", "Haumea", "Makemake", "Eris"}

可以在复合字面值里使用"..."作为数组的长度,这样,Go编译器会自动计算出数组的元素数量

无论哪种方式,数组的长度都是固定的。

Go 复制代码
//复合字面值初始化数组
	planets1 := [...]string{
		"Mercury",
		"Venus",
		"Earth",
		"Mars",
		"Jupiter",
		"Saturn",
		"Pluto", //数组的最后一个参数后要补逗号

下面来看两个遍历数组的例子:

Go 复制代码
//遍历数组,法一:
	dwarfs := [5]string{"Ceres", "Pluto", "Haumea", "Makemake", "Eris"}

	for i := 0; i < len(dwarfs); i++ {
		dwarf := dwarfs[i]      //此处的dwarf和下方的dwarf同时定义但不报错,是闭包现象:此处的dwarf被封闭在了for循环函数内。
		fmt.Println(i+1, dwarf) //人性化设计
	}
	
    //法二:
    for i, dwarf := range dwarfs {
		fmt.Println(i, dwarf)
	}

数组的复制:

无论数组赋值给新的变量还是将它传递给函数,都会产生一个完整的数组副本。

Go 复制代码
planets := [...]string{
		"Mercury",
		"Venus",
		"Earth",
		"Mars",
		"Jupiter",
		"Saturn",
		"Pluto", //数组的最后一个参数后要补逗号
	}

	planetsMarkII := planets //数组复制

	planets[2] = "whoops"

	fmt.Println(planets)
	fmt.Println(planetsMarkII)

数组也是一种值,函数通过值传递来接受参数。所以数组作为函数的参数就非常的低效。

Go 复制代码
func terraform(planets [7]string) {
	for i := range planets {
		planets[i] = "New" + planets[i]
	}
}

func main(){

    planets := [...]string{
		"Mercury",
		"Venus",
		"Earth",
		"Mars",
		"Jupiter",
		"Saturn",
		"Pluto", //数组的最后一个参数后要补逗号
	}

    planets[6] = "rock"
	terraform(planets)
	fmt.Println(planets)
}

数组的长度也是数组类型的一部分(尝试将长度不符的数组作为参数传递,将会报错)

函数一般使用slice(切片)而不是数组作为参数,这个内容下一节会讲到。

再来看一个二维数组的例子

Go 复制代码
var board [8][8]string

	board[0][0] = "r"
	board[0][7] = "r"

	for column := range board[1] { //把二维数组board的第二行全部替换为P
		board[1][column] = "p"
	}

	fmt.Print(board)
相关推荐
超级架构师43 分钟前
PRAXO-CORE 2.5.0:用 conformance 和显式边界构建 Go Agent 框架
开发语言·人工智能·后端·golang·ai编程·智能体框架·praxo-core
深圳市快瞳科技有限公司1 小时前
野外鸟类AI识别落地实录:输入适配、结构化输出、去重聚合与置信度分流的工程实践
算法·计算机视觉·鸟类识别·鸟类ai识别·野外鸟类观测·林业调查
叼烟扛炮1 小时前
Linux 学习笔记(四十一):TCP 并发演进——从单进程到多线程服务器
linux·运维·服务器·网络·笔记·学习·tcp/ip
叼烟扛炮1 小时前
Linux 学习笔记(四十三):网络编程进阶——自定义协议解决 TCP 粘包与守护进程
linux·开发语言·网络·笔记·tcp/ip
songyuc2 小时前
【Manskill3】TableSceneBuilder学习笔记
pytorch·笔记·学习
专注仿真2 小时前
梯度提升类(XFBoost)算法详解与代码实例
开发语言·人工智能·python·算法·大模型训练·控制算法
小豆庄2 小时前
视频遮罩追踪退场后ID撞号的排查—多目标场景下的失效
opencv·算法·bug·视频·python3.11
Tisfy3 小时前
LeetCode 3882.网格图中最小异或路径:动态规划
算法·leetcode·动态规划
D e re k ZH4 小时前
P5025 [SNOI2017] 炸弹
c++·算法
A boy CDEF girl4 小时前
算法题专栏:优选算法
数据结构·算法·leetcode