【Go语言】Go语言中的数组

Go语言中的数组

1 数组的初始化和定义

在 Go 语言中,数组是固定长度的、同一类型的数据集合。数组中包含的每个数据项被称为数组元素,一个数组包含的元素个数被称为数组的长度。

在 Go 语言中,你可以通过 [] 来标识数组类型,但需要指定长度和元素类型。以下是一些常见的数组声明方法:

var a [8]byte // 长度为8的数组,每个元素为一个字节
var b [3][3]int // 二维数组(9宫格)
var c [3][3][3]float64 // 三维数组(立体的9宫格)
var d = [3]int{1, 2, 3}  // 声明时初始化
var e = new([3]string)   // 通过 new 初始化

数组也可以通过 := 进行一次性声明和初始化,所有数组元素通过 {} 包裹:

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

还可以通过语法糖声明省略数组长度:

array2 := [...]int{1, 2, 3}  // 编译时,Go语言会自动计算该数组的长度

数组在初始化的时候,如果没有填满,则空位会通过对应元素的零值填满:

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

Go语言中,数组初始化时,可以指定下标位置的元素值,未指定的位置,数据元素类型的零值填充:

a := [5]int{1:3, 3:5}

2 数组元素的访问和设置

可以使用数组下标来访问 Go 数组中的元素,数组下标默认从 0 开始,len(arr)-1 表示最后一个元素的下标:

arr := [5]int{1,2,3,4,5}
a1, a2 := arr[0], arr[len(arr) - 1]

如上数组arr,a1 的值是1,a2是数组的最后一个元素5。

访问数组元素时,下标必须在有效范围内,比如对于一个长度为5的数组,下标有效范围时 [0,4],超出这个范围编译时会报索引越界异常:

和字符串这种不可变值类型不一样,数组除了支持下标访问对应索引的元素值以外,还能够通过下标设置对应索引位置的元素值:

arr[0] = 100

3 数组元素的遍历

可以通过for循环遍历数组中所有的元素:

for i := 0; i < len(arr); i++ {fmt.Println("Element", i, "of arr is", arr[i])}

Go 语言还提供了一个关键字 range,也能够用于遍历数组中的元素:

for i, v := range arr { fmt.Println("Element", i, "of arr is", v) 
}

range 表达式返回两个值,第一个是数组下标索引值,第二个是索引对应数组元素值,如果只想获取元素值或者只想获取索引值可以借助匿名变量:

// 只获取索引值
for i, _ := range arr {fmt.Println("index is ", i)
}
// 只获取元素值
for _, v := range arr {fmt.Println("value is ", v)
}

4 多维数组

多维数组的操作与一维数组一样,只不过每个元素可能是个数组,在进行循环遍历的时候需要多层嵌套循环,下面是一个多维数组声明、初始化以及使用:

// 声明二维数组
var multi [9][9]string
// 二维数组元素赋值
for i := 0; i < 9; i++ {for j := 0; j < 9; j++ {m := i + 1n := j + 1if n > m {// 九九乘法表// 1*1 = 1// 1*2 = 2 2*2 = 4// 1*3 = 3 2*3 = 6 3*3 = 9// 当n>m,跳出循环continue}multi[i][j] = fmt.Sprintf("%d*%d=%d", n, m, m*n)}
}
// 二维数组打印
for i := 0; i < 9; i++ {for j := 0; j < 9; j++ {if j > i {continue}fmt.Printf(multi[i][j] + " ")if j == i {fmt.Println()}}
}

代码运行,打印的内容如下:

多维数组打印有一个优化的方法,代码如下:

// 打印九九乘法表
for _, v1 := range multi {for _, v2 := range v1 {fmt.Printf("%-8s", v2)  // 位宽为8,左对齐}fmt.Println()
}

5 数组总结

Go语言中的数组类型遍历一旦声明后长度就不能再变,这样就无法动态添加元素到数组中,如果要添加一个元素到数组中,需要将就数组的元素都拷贝过来,最后添加新的元素,如果数组的长度不能确定,我们设置了一个较多元素的数组,这就会影响到程序的性能。

数组是值类型,将数组作为参数传递到函数时,传递的是数组的值拷贝,也即会先将数组拷贝到形参,函数体中引用的是形参而不是原来的数组,当我们在函数中对数组元素进行修改的时候,并不会影响原来数组的值,如果数组很大时,值拷贝也会影响到程序的性能。

因此,Go语言也有一个引用类型的、支持动态添加元素的新“数组”类型,也即切片类型。在Go语言中,实际很少使用数组,大多时间会使用切片取代数组。

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

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

相关文章

3D生成式AI模型与工具

当谈到技术炒作时&#xff0c;人工智能正在超越虚拟世界&#xff0c;吸引世界各地企业和消费者的注意力。 但人工智能可以进一步增强虚拟世界&#xff0c;至少在某种意义上&#xff1a;资产创造。 AI 有潜力扩大用于虚拟环境的 3D 资产的创建。 AI 3D生成使用人工智能生成3D模…

华为高级路由技术 2023-2024

2023-2024 一、2.26路由协议版本优先级和度量主和备路由最长匹配原则递归路由和默认路由 一、2.26 路由协议版本 &#xff08;1&#xff09;RIP&#xff1a; IPv4网&#xff1a;RIPv1&#xff0c;RIPv2&#xff08;v1和v2 不兼容&#xff09; IPv6网&#xff1a;RIPng(Next g…

备战蓝桥杯Day17 - 链表

链表 基本概念 链表是由一系列节点组成的元素集合。 每个节点包含两部分&#xff1a;数据域 item 、指向下一个节点的指针 next 通过节点之间的相互链接&#xff0c;形成一个链表 1. 链表的初始化 # 手动建立链表 # 链表的初始化 class Node(object):def __init__(self, …

WinForms中的Timer探究:Form Timer与Thread Timer的差异

WinForms中的Timer探究&#xff1a;Form Timer与Thread Timer的差异 在Windows Forms&#xff08;WinForms&#xff09;应用程序开发中&#xff0c;定时器&#xff08;Timer&#xff09;是一个常用的组件&#xff0c;它允许我们执行定时任务&#xff0c;如界面更新、周期性数据…

spring Boot快速入门

快速入门为主主要届介绍java web接口API的编写 java编辑器首选IntelliJ IDEA 官方链接&#xff1a;https://www.jetbrains.com/idea/ IEDA 前言 实例项目主要是web端API接口的使用&#xff0c;项目使用mysql数据库&#xff0c;把从数据库中的数据的查询出来后通过接口json数…

腾讯云4核8G服务器支持多少人在线访问?

腾讯云4核8G服务器支持多少人在线访问&#xff1f;支持25人同时访问。实际上程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#xff0c;假设公网带宽太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU内存也会造成计算…

Spring 的三级缓存机制

Spring 的三级缓存机制 Spring 的三级缓存机制是解决循环依赖的关键。 Spring 框架为了解决循环依赖问题&#xff0c;设计了一套三级缓存机制。这三级缓存分别是&#xff1a; 一级缓存 singletonObjects&#xff1a;这是最常规的缓存&#xff0c;用于存放完全初始化好的 bea…

【服务器数据恢复】FreeNAS+ESXi虚拟机数据恢复案例

服务器数据恢复环境&#xff1a; 一台服务器通过FreeNAS&#xff08;本案例使用的是UFS2文件系统&#xff09;实现iSCSI存储&#xff0c;整个UFS2文件系统作为一个文件挂载到ESXi虚拟化系统&#xff08;安装在另外2台服务器上&#xff09;上。该虚拟化系统一共有5台虚拟机&…

什么是高可用架构

一、什么是高可用 在运维中&#xff0c;经常听到高可用&#xff0c;那么什么是高可用架构呢&#xff1f;通俗点讲&#xff0c;高可用就是在服务故障&#xff0c;节点宕机的情况下&#xff0c;业务能够保证不中断&#xff0c;服务正常运行。 举个例子&#xff0c;支付宝&#…

开源大模型LLM大爆发,数据竞赛已开启!如何使用FuseLLM实现大语言模型的知识融合?

开源大模型LLM大爆发&#xff0c;数据竞赛已开启&#xff01;如何使用FuseLLM实现大语言模型的知识融合&#xff1f; 现在大多数人都知道LLM是什么&#xff0c;以及可以做什么。 人们讨论着它的优缺点&#xff0c;畅想着它的未来&#xff0c; 向往着真正的AGI&#xff0c;又有…

弱结构化日志 Flink SQL 怎么写?SLS SPL 来帮忙

作者&#xff1a;潘伟龙&#xff08;豁朗&#xff09; 背景 日志服务 SLS 是云原生观测与分析平台&#xff0c;为 Log、Metric、Trace 等数据提供大规模、低成本、实时的平台化服务&#xff0c;基于日志服务的便捷的数据接入能力&#xff0c;可以将系统日志、业务日志等接入 …

MS2403隔离Σ-Δ调制器

产品简述 MS2403 是一款二阶 Σ-Δ 调制器&#xff0c;集成片上数字隔离器&#xff0c;能 将模拟输入信号转换为高速 1 位码流。调制器对输入信号连续 采样&#xff0c;无需外部采样保持电路。模拟信号输入满量程为 320 mV &#xff0c;转换后的数字码流的最高数据速率为 2…

STM32系列芯片的命名规则(STM32学习之路)

STM32系列芯片命名规则 STM32F103C8T6 1.产品系列&#xff1a; STM32代表ST品牌Cortex-Mx系列内核&#xff08;ARM&#xff09;的32位MCU 2.产品类型&#xff1a; F &#xff1a;通用快闪&#xff08;FlashMemory&#xff09; L&#xff1a;低电压&#xff08;1.65&#xf…

IO进程线程day8作业

信号灯集二次函数封装 sem.c #include<myhead.h>union semun {int val; /* Value for SETVAL */struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */unsigned short *array; /* Array for GETALL, SETALL */struct seminfo *__buf; /* B…

Educational Codeforces Round 162 (Rated for Div. 2)(A~D)

A. Moving Chips 分析&#xff1a;先找出区间[l,r]&#xff0c;a[l]为1第一次出现&#xff0c;a[r]为1最后一次出现&#xff0c;[l,r]以外的区间不用管。 所以我们要将[l,r]中所有1的区域块练成一块。 经过简单的样例分析发现&#xff0c;假设1的区域t1和区域t2间有x个0&…

springboot+vue实现微信公众号扫码登录

通常在个人网站中&#xff0c;都会有各种第三方登录&#xff0c;其中微信登录需要认证才能使用&#xff0c;导致个人开发者不能进行使用此功能&#xff0c;但是我们可以使用微信公众号回复特定验证码来进行登录操作。 微信关键词处理 微信公众号关键词自动回复&#xff0c;具体…

第3.5章:StarRocks数据导入——Broker Load

注&#xff1a;本篇文章阐述的是StarRocks-3.2版本的Broker Load导入机制 一、概述 Broker Load导入方式支持从HDFS类的外部存储系统&#xff08;例如&#xff1a;HDFS、阿里OSS、腾讯COS、华为云OBS等&#xff09;&#xff0c;支持Parquet、ORC、CSV、及 JSON 四种文件格式&a…

c#程序,oracle使用Devart驱动解决第第三方库是us7ascii,数据乱码的问题

最近做项目&#xff0c;要跟对方系统的库进行读写&#xff0c;结果发现对方采用的是oracle的us7ascii编码&#xff0c;我们系统默认采用的是ZHS16GBK&#xff0c;导致我们客户端读取和写入对方库的数据都是乱码&#xff0c;搜索网上&#xff0c;发现需要采用独立的oracle驱动去…

【GPTs分享】GPTs分享之Write For Me

Write For Me 是一个专门定制的GPT版本&#xff0c;旨在为用户提供高质量的文本内容创作服务。它适用于各种写作需求&#xff0c;从商业计划、学术文章到创意故事等。下面是从简介、主要功能、使用案例、优点和局限性几个方面对Write For Me 的详细介绍。 简介 Write For Me …

【初始RabbitMQ】高级发布确认的实现

在生产环境中由于一些不明原因&#xff0c;导致 rabbitmq 重启&#xff0c;在 RabbitMQ 重启期间生产者消息投递失败&#xff0c; 导致消息丢失&#xff0c;需要手动处理和恢复。于是&#xff0c;我们开始思考&#xff0c;如何才能进行 RabbitMQ 的消息可靠投递呢&#xff1f; …