【Go语言基础【15】】数组:固定长度的连续存储结构

news2025/6/8 6:17:47

文章目录

  • 零、概述
  • 一、数组基础
    • 1、数组的本质:固定长度的连续存储结构
    • 2、声明与初始化
    • 3、访问与修改元素
  • 二、数组拷贝与传参
    • 1、 值拷贝特性
    • 2、指针数组的拷贝
    • 3、函数传参(值传递)
  • 三、数组遍历
  • 四、多维数组
  • 五、数组与切片的区别

零、概述

数组核心语法速查表

操作语法示例说明
声明数组var arr [5]int长度5,元素默认0
初始化数组arr := [3]string{"a", "b", "c"}完整初始化
自动推断长度arr := [...]int{1, 2, 3}长度为3
指定索引初始化arr := [4]int{0: 1, 2: 3}索引0→1,索引2→3,其余为0
访问元素value := arr[2]索引从0开始
遍历数组for i, v := range arr { ... }使用for range
多维数组var matrix [2][3]float64二维数组,2行3列

适用场景

  1. 需要固定长度的数据集合:如存储月份天数、矩阵数据。
  2. 性能敏感场景:连续内存结构适合缓存优化,访问速度快于切片。
  3. 值语义需求:需要确保数据拷贝时的独立性(如游戏棋盘状态)。

注意事项

  1. 越界检查:访问超出索引范围的元素会触发panic,需通过len(arr)判断边界。
  2. 大数组性能:拷贝大数组时性能较低,建议使用切片或指针传递。
  3. 类型一致性:数组长度和元素类型必须完全匹配才能赋值或比较。

 

一、数组基础

1、数组的本质:固定长度的连续存储结构

Go语言中的数组是值类型,具有以下核心特性:

  • 固定长度:声明时必须指定长度,运行时不可增减(长度是类型的一部分,如[5]int[6]int是不同类型)。
  • 连续内存:元素在内存中连续存放,支持高效的索引访问(时间复杂度O(1))。
  • 类型统一:所有元素类型相同,可存储内置类型(如intstring)或自定义类型(如结构体)。

内存结构示例

arr := [4]int{3, 1, 4, 1} // 长度为4的int数组
  • 索引从0开始,每个元素占4字节(int在32位系统占4字节)。
  • 内存地址连续,可通过arr[i]直接访问第i个元素。

 

2、声明与初始化

** 基本声明语法**

var 数组名 [长度]类型 // 未初始化,元素为类型零值
var scores [5]float64 // 长度5的float64数组,默认值全为0
var names [3]string  // 默认值全为空字符串""

 
初始化方式

(1)完整初始化

arr := [长度]类型{1,2, ...} // 显式指定所有元素
primes := [3]int{2, 3, 5} // 长度3,元素为2、3、5

(2)自动推断长度(...

arr := [...]类型{1,2, ...} // 长度由初始化值个数决定
fruits := [...]string{"apple", "banana", "orange"} // 长度3

(3)指定索引初始化

arr := [长度]类型{索引:, 索引:, ...} // 仅初始化指定索引的元素
points := [4]int{0: 10, 3: 20} // 索引0→10,索引3→20,其余为0
// 数组为:[10, 0, 0, 20]

 

3、访问与修改元素

索引访问
语法数组名[索引],索引范围[0, 长度-1],越界会触发运行时panic

arr := [3]int{1, 2, 3}
fmt.Println(arr[0]) // 输出:1
arr[1] = 4          // 修改索引1的元素为4

指针数组
定义:元素为指针的数组,用于存储多个地址。

var ptrs [2]*int // 长度2的int指针数组
a, b := 10, 20
ptrs[0], ptrs[1] = &a, &b // 存储变量地址
fmt.Println(*ptrs[0]) // 输出:10

 

二、数组拷贝与传参

1、 值拷贝特性

数组是值类型,赋值或传参时会完整拷贝所有元素(包括指针数组中的指针值,但不拷贝指针指向的数据)。

arr1 := [2]int{1, 2}
arr2 := arr1           // 拷贝arr1的元素到arr2
arr1[0] = 100          // 修改arr1不影响arr2
fmt.Println(arr2[0])   // 输出:1(原拷贝值)

 

2、指针数组的拷贝

拷贝的是指针值(地址),若多个指针指向同一数据,修改会同步。
示例

str := "hello"
ptrArr1 := [1]*string{&str}
ptrArr2 := ptrArr1       // 拷贝指针值(均指向str)
*ptrArr1[0] = "world"    // 修改str,ptrArr2同步变化
fmt.Println(*ptrArr2[0]) // 输出:world

 

3、函数传参(值传递)

传递数组时,函数接收的是原数组的副本,修改副本不影响原始数组。
示例

func modify(arr [3]int) {
    arr[0] = 100 // 修改副本
}
func main() {
    arr := [3]int{1, 2, 3}
    modify(arr)   // 传递副本
    fmt.Println(arr[0]) // 输出:1(原始数组未改变)
}

 

三、数组遍历

  1. for循环遍历
arr := [3]string{"a", "b", "c"}
for i := 0; i < len(arr); i++ {
    fmt.Printf("索引%d: %s\n", i, arr[i])
}
  1. for range遍历
arr := [3]int{10, 20, 30}
for index, value := range arr {
    fmt.Printf("索引%d: 值%d\n", index, value)
}
// 输出:
// 索引0: 值10
// 索引1: 值20
// 索引2: 值30

四、多维数组

  1. 二维数组
// 声明:[外层长度][内层长度]类型
matrix := [2][3]int{{1, 2, 3}, {4, 5, 6}} // 2行3列

访问元素matrix[行索引][列索引]

fmt.Println(matrix[0][2]) // 输出:3(第1行第3列)
  1. 三维数组
cube := [2][2][2]int{
    {{1, 2}, {3, 4}},
    {{5, 6}, {7, 8}},
}

 

五、数组与切片的区别

特性数组(Array)切片(Slice)
长度固定(声明时确定)动态(可扩容)
类型包含长度(如[5]int不包含长度(如[]int
内存分配连续内存,固定大小底层依赖数组,可动态扩展
传参值传递(拷贝所有元素)引用传递(仅拷贝切片头信息)

注意:切片是数组的“视图”,通过arr[:]可将数组转换为切片。

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

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

相关文章

【读论文】U-Net: Convolutional Networks for Biomedical Image Segmentation 卷积神经网络

摘要1 Introduction2 Network Architecture3 Training3.1 Data Augmentation 4 Experiments5 Conclusion背景知识卷积激活函数池化上采样、上池化、反卷积softmax 归一化函数交叉熵损失 Olaf Ronneberger, Philipp Fischer, Thomas Brox Paper&#xff1a;https://arxiv.org/ab…

Linux 文件系统与 I/O 编程核心原理及实践笔记

文章目录 一、理解文件1.1 狭义理解1.2 广义理解1.3 文件操作的归类认识1.4 系统角度&#xff1a;进程与文件的交互1.5 实践示例 二、回顾 C 文件接口2.1 hello.c 打开文件2.2 hello.c 写文件2.3 hello.c 读文件2.4 输出信息到显示器的几种方法2.5 stdin & stdout & st…

vite+tailwind封装组件库

前言 演示视频 https://www.bilibili.com/video/BV1EST3zPEyP/?spm_id_from333.1387.homepage.video_card.click 参考 https://juejin.cn/post/7112295067682865166 https://juejin.cn/post/7046187185615142949 代码仓库 https://gitee.com/malguy/vite-components-li…

【Java学习笔记】包装类

包装类&#xff08;Wrapper&#xff09; 1. 介绍 &#xff08;1&#xff09;针对八种基本数据类型相应的引用类型 --> 包装类 &#xff08;2&#xff09;有了类的特点&#xff0c;就可以调用类中的方法 2. 分类和继承关系 基本数据类型包装类父类booleanBooleanObjectc…

【高效开发工具系列】Blackmagic Disk Speed Test for Mac:专业硬盘测速工具

博客目录 一、Blackmagic Disk Speed Test 概述二、软件核心功能解析三、v3.3 版本的新特性与改进四、实际应用场景分析五、使用技巧与最佳实践六、与其他工具的比较及优势 一、Blackmagic Disk Speed Test 概述 Blackmagic Disk Speed Test 是 Mac 平台上广受专业人士青睐的一…

UniRig:如何在矩池云一站式解决 3D 模型绑定难题

在 3D 动画制作中&#xff0c;绑定&#xff08;Rigging&#xff09;是一个至关重要但复杂耗时的步骤。它包括为 3D 模型创建骨架并分配蒙皮权重&#xff0c;以实现流畅的动画效果。由清华大学与 Tripo 联合开发的 UniRig 框架&#xff0c;为这一难题提供了全新的解决方案。 什…

字符串字典序最大后缀问题详解

字符串字典序最大后缀问题详解 一、问题定义与背景1.1 问题描述1.2 实际应用场景 二、暴力解法及其局限性2.1 暴力解法思路2.2 代码示例2.3 局限性分析 三、双指针算法&#xff1a;高效解决方案3.1 算法核心思想3.2 算法步骤3.3 代码实现3.4 与暴力解法对比 四、复杂度分析4.1 …

VScode打开后一直显示正在重新激活终端 问题的解决方法

一、问题 本人打开“.py”文件后&#xff0c;同时会出现以下两个问题。 1、VScode一直循环在”正在重新激活终端“ 2、日志显示intellicode报错&#xff1a; Sorry, something went wrong activating IntelliCode support for Python. Please check the “Python” and “VS I…

pe文件结构(TLS)

TLS 什么是TLS? TLS是 Thread Local Storage 的缩写&#xff0c;线程局部存储。主要是为了解决多线程中变量同步的问题 如果需要要一个线程内部的各个函数调用都能访问&#xff0c;但其它线程不能访问的变量&#xff08;被称为static memory local to a thread 线程局部静态变…

中型零售业数据库抉择:MySQL省成本,SQL SERVER?

针对中型零售企业&#xff08;20台固定POS数十台移动POS&#xff0c;含库存管理与结算业务&#xff09;的操作系统与数据库选型&#xff0c;需平衡性能、成本、扩展性及运维效率。结合行业实践与系统需求&#xff0c;建议如下&#xff1a; &#x1f5a5;️ ​​一、操作系统选型…

IDEA中的debug使用技巧

详细教学视频见b站链接&#xff1a;IDEA的debug调试 CSDN详细博客文章链接&#xff1a;debug文章学习 以下为个人学习记录总结&#xff1a; idea中的debug模式界面如下&#xff1a; 现在详细介绍图标作用&#xff1a; 图标一&#xff08;Show Execution Point&#xff09;&…

RockyLinux9.6搭建k8s集群

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

AI IDE 正式上线!通义灵码开箱即用

近期&#xff0c;通义灵码AI IDE正式上线&#xff0c;即日起用户可在通义灵码官网免费下载开箱即用。 作为AI原生的开发环境工具&#xff0c;通义灵码AI IDE深度适配了最新的千问3大模型&#xff0c;并全面集成通义灵码插件能力&#xff0c;具备编程智能体、行间建议预测、行间…

Ubuntu20.04基础配置安装——系统安装(一)

引言&#xff1a; 工作需要&#xff0c;Ubuntu的各类环境配置&#xff0c;从23年开始使用Ubuntu20.04之后&#xff0c;尽管能力在不断提升&#xff0c;但是依旧会遇到Ubuntu系统崩掉的情况&#xff0c;为了方便后续系统出现问题及时替换&#xff0c;减少从网上搜索资源进行基础…

Kafka入门-消费者

消费者 Kafka消费方式&#xff1a;采用pull&#xff08;拉&#xff09;的方式&#xff0c;消费者从broker中主动拉去数据。使用pull的好处就是消费者可以根据自身需求&#xff0c;进行拉取数据&#xff0c;但是坏处就是如果Kafka没有数据&#xff0c;那么消费者可能会陷入循环…

中电金信:从智能应用到全栈AI,大模型如何重构金融业务价值链?

导语 当前&#xff0c;AI大模型技术正加速重构金融行业的智能化图景。为助力金融机构精准把握这一变革机遇&#xff0c;中电金信与IDC联合发布《中国金融大模型发展白皮书》。《白皮书》在梳理了AI大模型整体发展现状的基础上&#xff0c;结合金融行业用户的需求调研深入分析了…

巴西医疗巨头尤迈Kafka数据泄露事件的全过程分析与AI安防策略分析

一、事件背景与主体信息 涉事主体:Unimed,全球最大医疗合作社,巴西医疗行业龙头企业,拥有约1500万客户。技术背景:泄露源于其未保护的Kafka实例(开源实时数据传输平台),用于客户与聊天机器人“Sara”及医生的实时通信。二、时间线梳理 时间节点关键事件描述2025年3月24…

快速上手 Metabase:从安装到高级功能实战

文章目录 1. 引言&#xff1a;Metabase——轻量级的数据分析工具&#x1f3af; 学完本教程你能掌握&#xff1a; 2. 安装 Metabase&#xff1a;本地部署实操2.1 环境准备2.2 使用 Docker 安装 Metabase2.3 初始化设置2.4 连接外部数据库 3. 第一个数据探索&#xff1a;5分钟创建…

Linux基础命令which 和 find 简明指南

&#x1f3af; Linux which 和 find 命令简明指南&#xff1a;从入门到实用 &#x1f4c5; 更新时间&#xff1a;2025年6月7日 &#x1f3f7;️ 标签&#xff1a;Linux | which | find | 命令行 | 文件查找 文章目录 前言&#x1f31f; 一、Linux 命令的本质与 which、find 的作…

思尔芯携手Andes晶心科技,加速先进RISC-V 芯片开发

在RISC-V生态快速发展和应用场景不断拓展的背景下&#xff0c;芯片设计正面临前所未有的复杂度挑战。近日&#xff0c;RISC-V处理器核领先厂商Andes晶心科技与思尔芯&#xff08;S2C&#xff09;达成重要合作&#xff0c;其双核单集群AX45MPV处理器已在思尔芯最新一代原型验证系…