一篇文章让你明白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…

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 浏览器现状感到不满。 尽管市面上有许多浏览器可供选择,但其中大多数…

抗辐照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…

高通Quick板上安装编译Ros1 noetic,LeGO_LOAM,FAR_Planner和rslidar_sdk

环境要求&#xff1a; 这里quick板上安装的是Ubuntu20.04版本 Ros Noeti安装&#xff1a; 1.设置软件源&#xff1a; 官方提供的软件源&#xff1a; sudo sh -c echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.…

一招解决Mac没有剪切板历史记录的问题

使用Mac的朋友肯定都为Mac的剪切功能苦恼过&#xff0c;旧内容覆盖新内容&#xff0c;导致如果有内容需要重复输入的话&#xff0c;就需要一次一次的重复复制粘贴&#xff0c;非常麻烦 但其实Mac也能够有剪切板历史记录功能&#xff0c;iCopy&#xff0c;让你的Mac也能拥有剪切…

nginx 搭建网站

1.查看防火墙状态systemctl status firewalld 2.getenforce 3.安装nginx yum install nginx -y 4.网站信息 echo "welcome to yinchuankejixuanyuan" > /usr/share/nginx/html/index.html 5.查看命令状态 nginx -t 6.重启 systemctl restart nginx

gin入门

Gin入门笔记 1. 初始gin 1.1. 依赖安装 go get github.com/gin-gonic/gin写gin程序都有一套固定的格式 初始化写路由监听运行 1.2. hello world package mainimport ("github.com/gin-gonic/gin""net/http" )func main() {router : gin.Default()rou…

CentOS 7 安装 ntp,自动校准系统时间

1、安装 ntp yum install ntp 安装好后&#xff0c;ntp 会自动注册成为服务&#xff0c;服务名称为 ntpd 2、查看当前 ntpd 服务的状态 systemctl status ntpd 3、启动 ntpd 服务、查看 ntpd 服务的状态 systemctl start ntpdsystemctl status ntpd 4、设置 ntpd 服务开机启…

Unity3D UI 拖拽

Unity3D 实现 UI 元素拖拽功能。 UI 拖拽 通常画布上的 UI 元素都是固定位置的&#xff0c;我们可以通过实现拖拽接口&#xff0c;让 UI 元素可以被拖拽到其他位置。 拖拽接口 创建一个脚本 UIDrag.cs&#xff0c;在默认继承的 MonoBehaviour 后面&#xff0c;再继承三个接…

基于 SSM(Spring + Spring MVC + MyBatis)框架构建电器网上订购系统

基于 SSM&#xff08;Spring Spring MVC MyBatis&#xff09;框架构建电器网上订购系统可以为用户提供一个方便快捷的购物平台。以下将详细介绍该系统的开发流程&#xff0c;包括需求分析、技术选型、数据库设计、项目结构搭建、主要功能实现以及前端页面设计。 需求分析 …

esp32学习:利用虫洞ESP32开发板,快速实现无线图传

我们的虫洞开发板&#xff0c;能够完美运行esp who AI代码&#xff0c;所以实现无线图传那是非常容易的&#xff0c;我们先看看examples目录&#xff1a; 里面有比较多的web例程&#xff0c;在这些例程下&#xff0c;稍作修改&#xff0c;就可以快速实现我的图传无线功能&#…