一篇文章让你明白Go语言之数组的定义与用法

Golang数组

  • 1. 数组的声明
    • 示例
  • 2. 数组的初始化
    • 初始化示例
  • 3. 访问和修改数组元素
    • 访问和修改元素的示例
  • 4. 数组的遍历
    • 遍历数组的示例
  • 5. 多维数组
    • 二维数组的示例
  • 6. 数组是值类型
    • 示例:数组的值传递
  • 7. 数组与切片的区别
  • 总结

在 Go 语言中,数组是一种固定长度的、元素类型一致的集合。它用于存储一定数量的相同类型数据,适用于数据量已知且不需要改变长度的场景。相比其他语言的数组,Go 语言的数组有一些特殊之处,比如 固定长度值类型

1. 数组的声明

在 Go 中,数组声明需要指定数组的长度和元素的类型。数组的长度是固定的,不能动态改变。

var arr [5]int // 声明一个长度为 5 的整型数组,默认值是 0

在这个例子中,arr 是一个长度为 5 的整数数组,每个元素的默认值是 0(对于整数类型)。其他类型的数组会有不同的默认值,如 float 的默认值为 0.0string 的默认值为 ""(空字符串),bool 的默认值为 false

示例

我们可以通过不同方式声明数组:

var intArray [10]int         // 10 个整型元素的数组
var stringArray [3]string    // 3 个字符串元素的数组
var boolArray [4]bool        // 4 个布尔值的数组

2. 数组的初始化

数组在声明时可以直接初始化值。可以在声明时为每个元素赋值,也可以使用 ... 让 Go 自动推断数组长度。

初始化示例

// 初始化方式一:直接指定元素
var arr1 = [5]int{1, 2, 3, 4, 5} // 长度为 5 的整数数组
fmt.Println(arr1) // 输出:[1 2 3 4 5]// 初始化方式二:让 Go 自动推断数组长度
var arr2 = [...]int{10, 20, 30} // 长度自动为 3
fmt.Println(arr2) // 输出:[10 20 30]// 初始化方式三:指定部分元素,未指定的元素使用默认值
arr3 := [5]int{1: 100, 3: 200} // 指定索引 1 和 3 的值
fmt.Println(arr3) // 输出:[0 100 0 200 0]

3. 访问和修改数组元素

数组元素可以通过索引访问。Go 语言的数组索引从 0 开始,到 长度 - 1 结束。我们可以使用索引来访问和修改数组的某个元素。

访问和修改元素的示例

arr := [5]int{1, 2, 3, 4, 5}fmt.Println(arr[0]) // 输出:1,访问第一个元素
arr[1] = 10         // 修改第二个元素的值
fmt.Println(arr)    // 输出:[1 10 3 4 5]

注意:访问数组时,索引不能超出数组的范围,否则会导致运行时错误。

4. 数组的遍历

Go 语言提供了两种常用方法来遍历数组:

  • 使用 for 循环
  • 使用 range 关键字

遍历数组的示例

arr := [5]int{10, 20, 30, 40, 50}// 方法一:使用传统的 for 循环
for i := 0; i < len(arr); i++ {fmt.Println(arr[i])
}// 方法二:使用 range 遍历数组
for index, value := range arr {fmt.Printf("Index: %d, Value: %d\n", index, value)
}

使用 range 遍历数组时可以同时获取索引元素的值,但如果不需要索引,可以使用 _ 来省略它:

for _, value := range arr {fmt.Println(value)
}

5. 多维数组

Go 语言支持多维数组。常见的多维数组有二维数组。二维数组可以理解为“数组的数组”,在数据结构上形成一个矩阵。

二维数组的示例

var matrix [3][3]int // 声明一个 3x3 的二维数组// 初始化二维数组
matrix := [3][3]int{{1, 2, 3},{4, 5, 6},{7, 8, 9},
}// 访问二维数组元素
fmt.Println(matrix[0][1]) // 输出:2,访问第一行第二列的元素// 修改二维数组元素
matrix[1][1] = 100 // 将第二行第二列的元素改为 100
fmt.Println(matrix)

可以使用嵌套的 for 循环或者 range 语句来遍历多维数组:

for i := 0; i < len(matrix); i++ {for j := 0; j < len(matrix[i]); j++ {fmt.Print(matrix[i][j], " ")}fmt.Println()
}

6. 数组是值类型

在 Go 语言中,数组是值类型,这意味着当数组被赋值给另一个数组,或者传递给函数时,会复制整个数组的数据。这种特性与一些其他语言(如 C/C++)不同,那里数组是引用传递。

示例:数组的值传递

func modifyArray(arr [3]int) {arr[0] = 100
}arr := [3]int{1, 2, 3}
modifyArray(arr)
fmt.Println(arr) // 输出:[1 2 3],因为原数组未被修改

在这个例子中,modifyArray 函数接收到的是 arr 的副本,因此对副本的修改不会影响原数组。如果需要修改原数组,可以使用指针(*)来传递数组的地址。

7. 数组与切片的区别

Go 语言中还有一种类似数组的数据结构叫切片slice)。切片与数组有以下区别:

  • 长度是否固定:数组长度固定,而切片长度可以动态增长。
  • 值传递 vs 引用传递:数组是值传递,复制时会创建新的副本;切片是引用传递,指向底层数组的相同位置。
  • 推荐使用:Go 通常推荐使用切片,因为切片更灵活,适合处理动态长度的数据。

例如:

arr := [5]int{1, 2, 3, 4, 5} // 数组,长度固定
slice := arr[1:4]            // 切片,从数组中切片,指向相同的底层数组
fmt.Println(slice)           // 输出:[2 3 4]

总结

  • 数组声明需要指定长度和元素类型,长度固定且不可更改。
  • 数组初始化可以使用完整的值列表,或者让 Go 自动推断长度。
  • 数组遍历可以用传统 for 循环或 range 关键字。
  • 多维数组是“数组的数组”,适用于矩阵类数据。
  • 数组是值类型,赋值或传参会复制整个数组。
  • 数组与切片的区别:数组是固定长度,切片可以动态扩展。

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

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

相关文章

LSM-TREE和SSTable

一、什么是LSM-TREE LSM Tree 是一种高效的写优化数据结构&#xff0c;专门用于处理大量写入操作 在一些写多读少的场景&#xff0c;为了加快写磁盘的速度&#xff0c;提出使用日志文件追加顺序写&#xff0c;加快写的速度&#xff0c;减少随机读写。但是日志文件只能遍历查询…

SDL线程

文章目录 SDL线程相关 SDL线程相关 SDL线程创建&#xff1a;SDL_CreateThreadSDL线程等待: SDL_WaitThreadSDL互斥锁 :SDL_CreateMutex/SDL_DestoryMutexSDL锁定互斥: SDL_LockMutex/SDL_UnlockMutexSDL条件变量:SDL_CreateCond/SDL_DestoryCondSDL条件变量 等待通知: SDL_Con…

Vite与Vue Cli的区别与详解

它们的功能非常相似&#xff0c;都是提供基本项目脚手架和开发服务器的构建工具。 主要区别 Vite在开发环境下基于浏览器原生ES6 Modules提供功能支持&#xff0c;在生产环境下基于Rollup打包&#xff1b; Vue Cli不区分环境&#xff0c;都是基于Webpack。 在生产环境下&…

STM32实现串口接收不定长数据

原理 STM32实现串口接收不定长数据&#xff0c;主要靠的就是串口空闲&#xff08;idle&#xff09;中断,此中断的触发条件与接收的字节数无关&#xff0c;只有当Rx引脚无后续数据进入时&#xff08;串口空闲时&#xff09;&#xff0c;认为这时候代表一个数据包接收完成了&…

jQuery UI 使用

jQuery UI 使用 jQuery UI 是一个建立在 jQuery JavaScript 库之上的用户界面交互、特效、小部件和主题的库。它提供了一系列的交互组件,如拖动、排序、选择等,以及小部件,如自动完成、日期选择器、滑块等。此外,jQuery UI 还提供了一套主题,使得开发者可以轻松地定制应用…

QToolbar工具栏下拉菜单不弹出有小箭头

这里说了怎么弹出&#xff1a;Qt 工具栏QToolBar添加带有弹出菜单的QAction_qt如何将action添加到工具栏-CSDN博客 然后如果你是在UI里面建立的action&#xff0c;并拖到了toolbar&#xff0c;并在代码中设置菜单&#xff0c;例如&#xff1a; ui->mytoolbar->setMenu(…

大数据专业为什么要学习Hadoop课程

在当今信息爆炸的时代&#xff0c;大数据成为了影响各行各业的重要因素&#xff0c;而Hadoop作为大数据处理的核心技术之一&#xff0c;自然成为大数据专业学生需要掌握的一项重要技能。本文将详细探讨大数据专业为何要学习Hadoop课程&#xff0c;帮助读者理解其必要性和实际应…

【C++】argc与argv

argc是一个整数&#xff0c;表示命令行参数的数量&#xff0c;包括程序的本身名称 argv是一个指向字符指针数组的指针&#xff0c;其中每个字符指针指向一个命令行参数的字符串 通常argv[0]存储程序的名称&#xff0c;argv[1], argv[2]等存储其他命令行参数值 #include<io…

DevExpress JS ASP.NET Core v24.1亮点 - 支持DateOnly/TimeOnly类型

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序。从Angular和Reac&#xff0c…

【HarmonyOS】键盘遮挡输入框UI布局处理

【HarmonyOS】键盘遮挡输入框UI布局处理 问题背景&#xff1a; 在开发输入框UI时&#xff0c;特别是登录页面的密码输入框靠下&#xff0c;或者是评论底部的pop弹框。 当我们输入框获得焦点后&#xff0c;键盘自下而上显示&#xff0c;一般情况下会遮挡住我们的UI布局。 导致…

Rust重写万物之——从头开始编写浏览器引擎

一款用 Rust 编写的全新“轮子”最近备受关注—— 因不满大公司垄断,Gosub 项目团队用 Rust 从头开始编写了一个新的浏览器引擎,目前 star 数已超过 3k。 Gosub 项目的诞生是因为不少用户对当前的 Web 浏览器现状感到不满。 尽管市面上有许多浏览器可供选择,但其中大多数…

如何在nginx中禁用Cookie

在 Nginx 中禁用 Cookies 可以通过清除或过滤请求和响应中的 Set-Cookie 头来实现。需要注意的是:禁用 Cookies 后,用户会丢失某些可能依赖 Cookies 的功能,比如登录状态、会话跟踪等。 1、第一种方法 可以使用 proxy_hide_header 指令隐藏 Set-Cookie 头 location / {proxy…

rk3568 适配 CAN

rk3568 适配CAN CAN(Controller Area Network),即控制器局域网,是一种高效可靠的串行通信协议。它广泛应用于汽车、工业自动化、医疗设备等领域,用于多个电子控制单元(ECU)之间的实时通信。 CAN总线的特点 多主控制: 网络上的任何节点都可以主动发起通信,无需中央控制…

抗辐照MCU芯片工艺解析:如何保障芯片的可靠性

行星探索、轨道飞行器任务和空间研究在内的太空项目需要创新的航天器系统技术提供通信与处理功能。随着商业航天的发展&#xff0c;对于航天电子系统需要考虑高可靠与高性能的同时&#xff0c;还需要考虑降低开发成本和缩短上市时间。 以MCU芯片AS32A401为例&#xff0c;该芯片…

python(自用查看版)

目录 1.注意事项 1.1 python的除法不是整除&#xff0c;得到的是浮点数 1.2算术符号基于数学的算术优先级。具体可自行查看。 1.3注释 1.4缩进 1.5换行 1.6常见关键字 1.7续行符 1.8报错 1.9赋值 1.10比较运算符 2.常量和表达式 3.变量 4.数据类型 4.1整型int …

微信小程序,点击bindtap事件后,没有跳转到详情页,有可能是app.json中没有正确配置页面路径

文章目录 1、index.wxml2、index.js检查点1. 确保目标页面存在2. 确保页面路径配置正确3. 检查页面接收参数productDetail.jsproductDetail.wxmlproductDetail.wxss 总结 1、index.wxml <!-- 商品搜索结果卡片容器 --><view class"search-result"><bl…

科技改变生活:最新智能开关、调光器及插座产品亮相

根据QYResearch调研团队的最新力作《欧洲开关、调光器和插座市场报告2023-2029》显示&#xff0c;预计到2029年&#xff0c;欧洲开关、调光器和插座市场的规模将攀升至57.8亿美元&#xff0c;并且在接下来的几年里&#xff0c;将以4.2%的复合年增长率&#xff08;CAGR&#xff…

OpenGL入门006——着色器在纹理混合中的应用

本节将理解顶点和片段着色器在纹理混合中的应用 文章目录 一些概念纹理时间依赖动画 实战简介dependenciesshader.fsshader.vsteenager.pngtex.png utilswindowFactory.hshader.hRectangleModel.hRectangleModel.cpp main.cppCMakeLists.txt最终效果 一些概念 纹理 概述&…

【9695】基于springboot+vue的学生就业管理系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取免费源码 项目描述 本学生就业管理系统以springboot作为框架&#xff…

C语言的进制表示【八进制,十六进制】

文章目录 C语言的进制表示【八进制&#xff0c;十六进制】题目介绍C语言的进制表示1. 十进制2. 八进制3. 十六进制4. 二进制 进制表示总结 C语言的进制表示【八进制&#xff0c;十六进制】 题目介绍 故事的起因是今天在群里看到有人发来的问题 //原题目 int main() {int a 0…