GO数组解密:从基础到高阶全解

在本文中,我们深入探讨了Go语言中数组的各个方面。从基础概念、常规操作,到高级技巧和特殊操作,我们通过清晰的解释和具体的Go代码示例为读者提供了全面的指南。无论您是初学者还是经验丰富的开发者,这篇文章都将助您更深入地理解和掌握Go数组的实际应用。

关注TechLead,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。

目录

  • 1. 数组的基础知识
    • 1.1 定义与特点
    • 1.2 数组的大小和类型
    • 1.3 数组与切片的不同
    • 1.4 数组的值类型特性
  • 2. 操作Go中的数组
    • 2.1 定义与初始化
    • 2.2 访问和修改数组元素
    • 2.3 遍历数组
    • 2.4 使用内置函数`len()`获取数组长度
  • 3. Go数组的高级用法
    • 3.1 多维数组与嵌套数组
    • 3.2 数组作为函数参数和返回值
    • 3.3 固定大小的数组和动态数组
    • 3.4 使用数组进行内存优化
  • 4. Go数组的特殊操作
    • 4.1 使用数组模拟其他数据结构
    • 4.2 比较两个数组
    • 4.3 使用数组作为map的键
    • 4.4 原地反转数组

file

1. 数组的基础知识

在计算机科学中,数组是由同一类型的元素组成的数据结构,这些元素通过索引进行识别。Go语言中的数组是固定长度的,这与其他编程语言中可能会遇到的动态数组或列表是不同的。

1.1 定义与特点

在Go中,数组定义为具有固定长度和特定类型的元素的集合。它的长度是类型的一部分,这意味着[5]int[10]int是不同的类型。

示例:

var a [3]int  // 定义一个长度为3的int数组

这个数组有3个整数的位置,它们的默认值都是0。

1.2 数组的大小和类型

数组的大小必须在定义时确定,而且不能更改。这是Go数组与许多其他语言的动态数组或切片的主要区别。

示例:

var b [5]string  // 长度为5的字符串数组
b[2] = "hello"  // 设置第三个位置的值为"hello"

1.3 数组与切片的不同

数组和切片都可以存储元素,但它们的行为是不同的。最大的区别是数组的大小是固定的,而切片的大小是动态的。

示例:

arr := [3]int{1, 2, 3}  // 一个固定长度的数组
sli := arr[:]  // 从数组创建一个切片

在上面的代码中,我们首先定义了一个长度为3的数组arr,然后创建了一个新的切片sli,该切片引用arr的所有元素。

1.4 数组的值类型特性

在Go中,数组是值类型,而不是引用类型。这意味着当数组赋值给另一个数组时,内容会被复制。任何在新数组上的更改都不会影响原始数组。

示例:

original := [3]int{1, 2, 3}
copy := original
copy[0] = 9fmt.Println(original)  // 输出:[1 2 3]
fmt.Println(copy)      // 输出:[9 2 3]

在这个示例中,尽管我们更改了copy数组的第一个元素,但original数组的内容仍然保持不变。


2. 操作Go中的数组

在Go中,对数组的操作是直观和简单的,但理解其内部工作方式对于有效地利用数组很重要。

2.1 定义与初始化

Go允许多种方式来定义和初始化数组。

示例1:使用零值初始化

var arr [5]int

这将定义一个长度为5的整数数组,所有元素都被初始化为其零值,即0。

示例2:使用特定的值初始化

arr := [5]int{1, 2, 3, 4, 5}

这个示例中,数组在声明的同时就被赋值了。

示例3:使用...来根据初始值的数量确定数组长度

arr := [...]int{1, 2, 3}

数组的长度在这里是3,因为我们提供了三个初始化的值。

2.2 访问和修改数组元素

数组元素可以通过索引进行访问和修改,索引从0开始。

示例:

arr := [3]int{1, 2, 3}
fmt.Println(arr[1]) // 输出: 2arr[1] = 4
fmt.Println(arr[1]) // 输出: 4

在上述代码中,我们首先访问了数组的第二个元素,然后修改了它的值。

2.3 遍历数组

你可以使用for循环和range关键字来遍历数组的每个元素。

示例:

arr := [3]string{"apple", "banana", "cherry"}for index, value := range arr {fmt.Printf("Index %d has value: %s\n", index, value)
}

输出:

Index 0 has value: apple
Index 1 has value: banana
Index 2 has value: cherry

2.4 使用内置函数len()获取数组长度

如果你需要知道数组的长度,可以使用len()函数。

示例:

arr := [4]float64{3.14, 6.28, 9.42, 12.56}
fmt.Println(len(arr)) // 输出: 4

这个示例输出数组的长度,即4。


3. Go数组的高级用法

在了解了Go数组的基础操作后,我们可以深入研究一些更高级的技巧和用法。

3.1 多维数组与嵌套数组

在Go中,你可以定义多维数组,最常见的是二维数组,例如,表示矩阵或表格。

示例:

// 定义一个2x3的整数二维数组
var matrix [2][3]int
matrix[0] = [3]int{1, 2, 3}
matrix[1] = [3]int{4, 5, 6}fmt.Println(matrix[1][2])  // 输出: 6

上述代码初始化了一个2x3的矩阵,并输出了第二行第三列的元素。

3.2 数组作为函数参数和返回值

由于数组是值类型,当数组作为函数参数传递时,它们会被复制。你也可以使数组成为函数的返回值。

示例:

func sum(arr [3]int) int {total := 0for _, v := range arr {total += v}return total
}arr := [3]int{10, 20, 30}
fmt.Println(sum(arr))  // 输出: 60

上述函数计算三个整数数组的总和。

3.3 固定大小的数组和动态数组

Go的数组长度是固定的,但有时你可能不知道数组的确切大小。虽然这通常意味着你应该使用切片,但有时使用固定大小的数组作为底层结构可能更有意义。

示例:

func printFirstThree(arr [3]string) {fmt.Println(arr[0], arr[1], arr[2])
}data := [...]string{"apple", "banana", "cherry", "date", "fig"}
printFirstThree([3]string{data[0], data[1], data[2]})  // 输出: apple banana cherry

这个示例显示了如何从更大的数组中选择一个子集并将其传递给函数。

3.4 使用数组进行内存优化

由于Go的数组是连续的内存块,它们对于需要缓存友好数据结构和内存紧凑的操作非常有用。

示例:

假设我们有一个表示3D点的结构,并且我们需要在一个大型数组中存储这些点,使用数组而不是切片可以提供更好的性能。

type Point3D struct {x, y, z float64
}var points [100000]Point3D  // 使用数组而不是切片来存储大量数据

4. Go数组的特殊操作

Go的数组虽然在语言中是一个基本数据结构,但仍然有一些特殊的操作方法和技巧可以让我们更有效地使用数组。

4.1 使用数组模拟其他数据结构

有时,为了优化性能或满足特定需求,我们可能会使用数组模拟其他数据结构。

示例:模拟队列

var queue [5]int
front, rear := -1, -1func enqueue(x int) bool {if rear == len(queue)-1 {return false // 队列满}if front == -1 {front = 0}rear++queue[rear] = xreturn true
}func dequeue() (int, bool) {if front == -1 {return 0, false // 队列空}val := queue[front]front++if front > rear {front, rear = -1, -1}return val, true
}enqueue(5)
enqueue(10)
v, ok := dequeue()
fmt.Println(v, ok) // 输出: 5 true

上述代码使用数组模拟了一个简单的队列。

4.2 比较两个数组

在Go中,你可以使用==操作符直接比较两个数组,前提是它们的类型和大小相同。

示例:

a := [3]int{1, 2, 3}
b := [3]int{1, 2, 3}
c := [3]int{1, 2, 4}fmt.Println(a == b) // 输出: true
fmt.Println(a == c) // 输出: false

这里,我们比较了两个相同和一个不同的数组。

4.3 使用数组作为map的键

由于数组在Go中是可比较的,它们可以被用作map的键。

示例:

dict := map[[2]string]string{{"en", "hello"}: "你好",{"en", "world"}: "世界",
}fmt.Println(dict[["en", "hello"]]) // 输出: 你好

在此示例中,我们使用一个字符串数组作为map的键。

4.4 原地反转数组

通过使用双指针方法,我们可以在不使用额外空间的情况下原地反转数组。

示例:

func reverse(arr *[5]int) {left, right := 0, len(*arr)-1for left < right {(*arr)[left], (*arr)[right] = (*arr)[right], (*arr)[left]left++right--}
}data := [5]int{1, 2, 3, 4, 5}
reverse(&data)
fmt.Println(data)  // 输出: [5 4 3 2 1]

关注TechLead,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/703657.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java使用Swagger文档报错“java.lang.NullPointerException: null”

java使用Swagger文档报错 一、问题二、解决1、报错2、源码3、方法 一、问题 java项目引入Swagger文档&#xff0c;后期因为一些原因导致Swagger文档不能使用&#xff0c;但是不影响项目运行和正常使用&#xff0c;但每次启动都会报错。 原因有可能是&#xff1a; 1、一个实体类…

【HMAC-SHA1算法以及工作原理】

曾梦想执剑走天涯&#xff0c;我是程序猿【AK】 目录 简述概要知识图谱总结 简述概要 连接HMAC-SHA1工作原理以及工具代码 知识图谱 HMAC&#xff08;Hash-based Message Authentication Code&#xff0c;基于散列的消息认证码&#xff09;是一种结合了密钥和消息的认证方法…

刚拿到的《HarmonyOS应用开发者高级认证》,全网整理的题目,将近300题,100%通过

刚拿到《HarmonyOS应用开发者高级认证》&#xff0c;现在把题目和答案分享一下&#xff0c;这些题目是我根据其他网站整理的&#xff0c;宁滥勿缺&#xff0c;有个别题目是重复的&#xff0c;抽半天时间看一下&#xff0c;应该是稳过的。当然建议还是先跟着文档学一下鸿蒙或者看…

Centos 7.5 上nginx设置开机自启动

nginx的安装目录 &#xff1a; /usr/local/nginx 一、没有设置开机自启动前&#xff0c;需要执行/usr/local/nginx/sbin/nginx 启动 二、接下来&#xff0c;我们设置开机自启动&#xff0c;就不用手动启动nginx了 1、cd /usr/lib/systemd/system/ 2、vi nginx.service [un…

如何在Win系统搭建Oracle数据库并实现远程访问【内网穿透】

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 前言 Oracle&#xff0c;是甲骨文公司的一款关系…

【深入理解设计模式】适配器设计模式

适配器设计模式 适配器设计模式是一种结构型设计模式&#xff0c;用于将一个类的接口转换成客户端所期望的另一个接口&#xff0c;从而使得原本由于接口不兼容而不能一起工作的类能够一起工作。适配器模式通常用于以下场景&#xff1a; 现有接口与需求不匹配&#xff1a;当需要…

Linux安装Mysql(超详细,亲测)

文章中的全部内容自己都有亲身实践&#xff0c;都是有效的&#xff0c;像常见登录错误中&#xff0c;那种错误的密码修改方式自己以前就浪费了很多事件&#xff0c;还有设置Mysql远程登录这些也是&#xff0c;所以我把这些操作整理了一下&#xff0c;让大家在安装和使用Mysql的…

多线程基础说明【基础篇】

目录 &#x1f32d;1.相关概念 &#x1f37f;2.创建和启动线程 &#x1f95e;3.线程安全 &#x1f9c8;4.死锁 &#x1f953;5.线程通信的方法 1.相关概念 1.1程序 为完成特定任务&#xff0c;用某种语言编写的一组指令的集合。即指一段静态的代码&#xff0c;静态对象…

都2024年了,软件测试面试都问什么?

1、最熟悉的 selenium 操作&#xff1f; 基本上 selenium 提供的一下几大类操作都能够灵活使用&#xff0c;比如说&#xff1a;八大元素定位方式、三大等待方式、用户点击、输入等常见操作、 还有窗口切换、iframe 切换操作&#xff0c;比如说 actionchains 文件上传、JS操作 等…

网站开发--详解Servlet

&#x1f495;"Echo"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;网站开发–详解Servlet 一.基本介绍 tomcat是Java中开发服务器的重要的一个工具,任何开发的服务器都要部署在tomcat之上,可以说tomcat是所有服务器的底座,为了更好的操作http,to…

golang学习3,golang 项目中配置gin的web框架

1.go 初始化 mod文件 go mod init gin-ranking 2.gin的crm框架 go get -u github.com/gin-gonic/gin 3.go.mod爆红解决

前后端分离Vue+node.js在线学习考试系统gqw7o

与其它应用程序相比&#xff0c;在线学习平台的设计主要面向于学校&#xff0c;旨在为管理员和学生、教师、院系提供一个在线学习平台。学生、教师、院系可以通过系统及时查看公告信息等。 在线学习平台是在Windows操作系统下的应用平台。为防止出现兼容性及稳定性问题&#xf…

B站项目-基于Pytorch的ResNet垃圾图片分类

基于Pytorch的ResNet垃圾图片分类 数据集预处理 画图片的宽高分布散点图 import osimport matplotlib.pyplot as plt import PIL.Image as Imagedef plot_resolution(dataset_root_path):image_size_list []#存放图片尺寸for root, dirs, files in os.walk(dataset_root_pa…

装配制造业的MES系统种的物料齐套技术

装配是制造企业涉及产品生产加工最为普遍的一种模式&#xff0c;包括汽车、电子、电器、电气等行业。经研究表明&#xff0c;装配在整个产品制造总成本中所占比例超过了50%&#xff0c;所占用的总生产时间比例在40%-60%&#xff0c;直接影响着产品质量和成本。装配制造非常强调…

树-王道-复试

树 1.度&#xff1a; 树中孩子节点个数&#xff0c;所有结点的度最大值为 树的度 2.有序树&#xff1a; 逻辑上看&#xff0c;树中结点的各子树从左至右是有次序的&#xff0c;不能互换。 **3.**树的根节点没有前驱&#xff0c;其他节点只有一个前驱 **4.**所有节点可有零个或…

Leetcoder Day23| 回溯part03:组合+分割

语言&#xff1a;Java/Go 39. 组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的所有不同组合 &#xff0c;并以列表形式返回。你可以按任意顺序返回这些组合。 candidates 中的同一个…

环形光源让图像质量瞬间提升,一探究竟吧!

光源对机器视觉检测系统的性能起着重要作用,精确的光学结构设计可以提高捕获图像的质量,准确地分离目标和背景信息,不充足的光线会使捕捉到的图像无法满足需求&#xff0c;针对不同的检测对象,不同的形状光源应运而生。我们来看看最常用的LED光源之一—环形光源。 环形光源&…

vue3 使用pina

一、Vue 3 项目中集成Pina 状态管理库 要在 Vue 3 项目中使用 Pina&#xff08;Vue 3 状态管理库&#xff09;&#xff0c;您可以按照以下步骤操作&#xff1a; 1. 安装 Pina 库相应的插件&#xff1a; yarn add pinia # 或者使用 npm npm install pinia 2. 在您的 Vue 3 项…

电脑休眠之后唤不醒

现象&#xff1a;午休时间电脑休眠了&#xff0c;醒来之后发现在密码输入界面&#xff0c;但鼠标键盘没反应。按重启键或电源机重新开机&#xff0c;结果开不了机。 原因&#xff1a;1、内存条脏了&#xff0c;导致内存条读取失败 2、休眠的时候硬盘休眠了&#xff0c;导致按…

AngularJS安装版本问题

一、安装 Angular CLI 脚手架安装命令&#xff1a; npm install -g angular/cli 在安装前请确保自己安装NodeJS环境版本为V18及以上&#xff0c;否则会因node版本问题导致项目无法正常运行。 脚手架安装后&#xff0c;已提示了当前node版本必须为18.13.0或大于20.9.0版本&…